2013-02-27 18 views
8

Was ich habe: Die nächste Struktur:SELECT Daten aus zwei Tabellen in MySql

table_zero
->id(primär mit Autoinkrement)
-> andere

table_1
->ID(Fremdschlüssel der Tabelle Null id)
-> VARCHAR (80) Beispielwert: (aahellobbb)
-> one_field

table_2
->ID(Fremdschlüssel für Tabelle Null ID)
-> varchar (160) Beispielwert: (aaecehellobbbb)
-> other_field

Was ich will: Suche und erhalten (id, varchar) Array alle Spiele mit dem '% str%' auf dem varchar Feld LIKE enthält. Wenn ich beispielsweise mit der Zeichenfolge "Hallo" suche, sollte ich beide Beispielwerte mit ihren jeweiligen IDs erhalten. Diese IDs werden immer unterschiedlich sein, da sie Verweise auf einen PRIMÄREN SCHLÜSSEL sind.

Was ich versuchte: Ich versuchte mit UNION ALL, aber es funktioniert nicht mit LIMITS in meinem Beispiel.

Antwort

9

Mit UNION können Sie mehrmals Zeilen mit der gleichen ID erhalten. Was ist mit der Verwendung von LEFT JOIN?

Wenn ich Ihre Frage verstanden habe:

SELECT table_zero.id, table_1.varchar_field, table_2.varchar_field 
FROM table_zero 
    LEFT JOIN table_1 ON table_zero.id = table_1.id 
    LEFT JOIN table_2 ON table_zero.id = table_2.id 
WHERE table_1.varchar_field LIKE '%str%' 
    OR table_2.varchar_field LIKE '%str%' 
+0

Dank für die Beantwortung. Es funktioniert gut für mich, aber ich bekomme ein Paar von zwei Feldern namens "Name". Jedes Paar hat einen NULL-Wert und die übereinstimmende Zeichenfolge. Ist das normal? Ich weiß es wegen der Doppeltabellensuche ... aber es scheint nur seltsam. Danke für Ihre Antwort;) –

+2

Wenn Sie nur ein Feld in Ihren Ergebnissen möchten, das die übereinstimmende Zeichenfolge enthält, können Sie 'COALESCE (table_1.varchar_field, table_2.varchar_field) AS matched_string' anstelle von' table_1.varchar_field, table_2.varchar_field' verwenden –

+0

Einfach wunderbar! : D –

2

testen

SELECT * 
FROM 
(
SELECT table_zero.id AS ID, table_1.varchar_field AS field 
FROM table_zero 
    JOIN table_1 ON table_zero.id = table_1.id 
WHERE table_1.varchar_field LIKE '%str%' 
UNION 
SELECT table_zero.id, table_2.varchar_field AS field 
FROM table_zero 
    JOIN table_2 ON table_zero.id = table_2.id 
) tbl 
WHERE 
tbl.field LIKE '%str%' 
+0

Danke, aber Frostys war der Definitive, D Denke trotzdem! –

+0

Übermäßige Verwendung von Speicher, wählen Sie 200.000 Zeilen Grenze 0, 10 in 20 Sekunden, wenn Absicht Reihenfolge um eine Spalte. –

1
SELECT table_zero.id, table_1.varchar_field, table_2.varchar_field 
FROM table_zero 
    LEFT JOIN table_1 ON table_zero.id = table_1.id 
    LEFT JOIN table_2 ON table_zero.id = table_2.id 
WHERE table_1.varchar_field LIKE '%str%' 
    OR table_2.varchar_field LIKE '%str%'