Ich habe 3 Tabellen, products
, productscategories
und categories
.Mysql-Gruppe mit mehreren Spalten mit inneren Verbindungen
Die productscategories
ist eine viele zu viele Tabelle mit nur ID-Nummern der anderen beiden Tabellen.
Das Ergebnis ohne die Gruppe sieht wie folgt aus:
id | Url | Category
-------------------------------------
1 | http://example.com/12 | hat
2 | http://example.com/12 | shoe
3 | http://example.com/13 | hat
4 | http://example.com/13 | jacket
5 | http://example.com/14 | hat
6 | http://example.com/14 | socks
Jetzt möchte ich mit der gleichen url
jede Zeile auszuschließen, wenn sie eine der gewählten Kategorien, in diesem Fall jacket
und shoe
.
Das unerwünschte Ergebnis sieht wie folgt aus:
id | Url | Category
-------------------------------------
1 | http://example.com/12 | hat
3 | http://example.com/13 | hat
5 | http://example.com/14 | hat
Da url
mit der ID 13 enthält jacket
ich es dort nicht wollen. Das Gleiche gilt für url
mit 14, die shoe
enthält.
Diese accur, weil ich mehrere Kategorien und mehrere URLs haben, die einander nicht bewusst sind.
Die SQL für die oben:
SELECT * FROM products
JOIN productscategories ON products.id = productscategories.product_id
JOIN categories ON categories.id = productscategories.category_id
WHERE categories.slug NOT IN (
'shoe',
'jacket',
)
GROUP BY products.image_url
Das gewünschte Ergebnis:
id | Url | Category
-------------------------------------
5 | http://example.com/14 | hat
Wie kann ich eine SQL-Abfrage machen, die URL kennt die Kategorie macht, wie oben?
Das war eine seltsam aussehende Antwort, aber es funktioniert in meinen Tests und es ist blitzschnell (30-60 Mal schneller als andere Antworten). Keine Fallstricke? Danke! –
@ JensTörnell auf MySQL das funktioniert gut. Auf anderen RDBMS kann Notwendigkeit 'sum (Fall, wenn Kategorien.Slug IN ('Schuh', 'Jacke') dann 1 else 0 Ende)' – Mike