2016-04-26 7 views
1

Im Versuch, eine Abfrage zu erstellen, wo ich alle Varianten bekommen, wo der Inhalt die Suche übereinstimmt. zum Beispiel basierend auf der Tabelle unten i alle Varianten erhalten möchten, die den Inhalt = „red“MySQL Auswählen von Zeilen, wenn ein verknüpftes Feld übereinstimmt

------------------------------------------- 
| ID | Product | Variant | Option | Content | 
------------------------------------------- 
| 1 | Shirt | 1  | size | S  | 
| 2 | Shirt | 1  | color | red  | 
| 3 | Shirt | 2  | size | M  | 
| 4 | Shirt | 2  | color | red  | 
| 5 | Shirt | 3  | size | L  | 
| 6 | Shirt | 3  | color | red  | 
| 7 | Shirt | 4  | size | M  | 
| 8 | Shirt | 4  | color | blue | 
------------------------------------------- 

enthält würde ich die Ergebnisse etwas sein mag wie:

------------------------------------------- 
| ID | Product | Variant | Option | Content | 
------------------------------------------- 
| 1 | Shirt | 1  | size | S  | 
| 2 | Shirt | 1  | color | red  | 
| 3 | Shirt | 2  | size | M  | 
| 4 | Shirt | 2  | color | red  | 
| 5 | Shirt | 3  | size | L  | 
| 6 | Shirt | 3  | color | red  | 
------------------------------------------- 

Und das Ergebnis wenn der Inhalt = M wäre, würde so etwas sein

------------------------------------------- 
| ID | Product | Variant | Option | Content | 
------------------------------------------- 
| 3 | Shirt | 2  | size | M  | 
| 4 | Shirt | 2  | color | red  | 
| 7 | Shirt | 4  | size | M  | 
| 8 | Shirt | 4  | color | blue | 
------------------------------------------- 

Ich hoffe, das macht Sinn. Danke!

Ich habe eine Geige http://sqlfiddle.com/#!9/63e64e/2

+0

großen Fragen kommen mit sqlfiddle.com +1 –

Antwort

1

Verwenden Sie eine Selbstverknüpfung gesetzt

SELECT v1.* 
FROM variant AS v1 
JOIN variant AS v2 ON v1.variant = v2.variant 
WHERE v2.content = 'red' 

Dies ist functionaly entspricht Tin Tran Abfrage, aber erfordert keine Unterabfrage zu schreiben, so ist es ein wenig einfacher. Sie müssen die Ausgabe EXPLAIN überprüfen, um sicherzustellen, dass sie gleich verarbeitet werden.

+0

Danke, arbeitete wie Charme, ii könnte einen zweiten Filter hier bauen kann. Http://sqlfiddle.com/#!9/be3bbe/6 mit der folgenden Abfrage SELECT v1 * FROM Variante AS v1 JOIN Variante AS v2 ON v1.variant = v2.variant WHERE v2.content = 'S' JOIN-Variante AS v3 ON v1.variant = v3.variant WHERE v3.content = 'winter' – Rafanake

+0

Alle 'JOIN'-Klauseln kommen zuerst, dann eine einzelne' WHERE'-Klausel mit 'AND' zwischen den Bedingungen . – Barmar

+0

Sie wollen wahrscheinlich tun, SELECT v1. * FROM Variante AS v1 JOIN Variante AS v2 ON v1.variant = v2.variant WHERE v2.content = 'S' ODER v2.content = 'winter'' –

1
SELECT v.id,v.product,v.variant,v.option,v.content 
FROM variant v 
INNER JOIN (SELECT variant FROM variant WHERE content = 'red')v2 
ON v.variant = v2.variant 
ORDER BY ID ASC 

nur 'red' zu 'M' ändern, wenn Sie Ihr anderes Ergebnis erhalten möchten.

http://sqlfiddle.com/#!9/63e64e/7

ich in Ihrem sqlfiddle bemerkt hat es eine Variante von M und Gelb, die im Ergebnis angezeigt wird, wenn Sie das ‚rot‘ String ‚M‘

+0

Vielen Dank, dass Sie mich alot geholfen! – Rafanake

1
SELECT * 
FROM variant 
WHERE 
variant.variant 
IN 
(
    SELECT variant.variant 
    FROM variant 
    WHERE variant.content = 'red' 
) 

Dies sollte relativ einfach zu verstehen sein. Sie haben eine innere Abfrage, die zuerst nach jeder Variante mit der verfügbaren Option sucht. Dann haben Sie die äußere Abfrage, die nach allen Werten aller Varianten sucht, die von der Variantensuche zurückgegeben wurden. Eine elegantere Möglichkeit, diese könnte so sein, etwas zu schreiben

SELECT * 
FROM variant 
INNER JOIN 
(
    SELECT variant2.variant 
    FROM variant variant2 
    WHERE variant2.content = 'red' 
) variant2 
ON variant.variant = variant2.variant 

In diesem Beispiel würden Sie benennen sie beide mindestens eine der zurückgegebenen Tabellen zu unterscheiden. Dies liegt daran, dass Sie zwei Instanzen derselben Tabelle aufrufen.

SELECT * 
FROM variant 
JOIN variant AS variant2 ON variant.variant = variant2.variant 
WHERE variant2.content = 'red' 

Hier ist ein weiteres Beispiel, das das gleiche Ergebnis ausgibt. Der Unterschied zu diesem ist, dass Sie es in einer einzigen Abfrage ausführen.

Eine gute Quelle über Verknüpfungen zu lernen, von hier zu finden ist: https://technet.microsoft.com/en-us/library/ms191472(v=sql.105).aspx

Einer meiner Lieblings-Diagramme zu Joins finden Sie hier: http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg Es ist ein paar Tricks fehlt, aber es hat eine gute Grundidee nicht geben Was können Sie mit Joins tun?

+0

Vielen Dank, überprüfen Sie diese Links! – Rafanake

+0

MySQL ist notorisch schlecht bei der Optimierung von 'WHERE col IN (SELECT ...)' Abfragen, also versuchen Sie, sie zu vermeiden. – Barmar

Verwandte Themen