Ich suche nach einer Möglichkeit, eine Abfrage zu erstellen, um Folgendes zu tun:
Betrachten wir 3 Tabellen:
- Produkte: Liste der Produkte
- Tags: Liste der Tags
- tag_ties: Tabelle, mit der ein Tag einem Produkt zugeordnet wird
Betrachten wir diese Struktur für jede Tabelle:
Produkte:
- id (int, Autoincrement)
- Name (Varchar, Name des Produkts)
Stichworte:
- id (int Autoincrement)
- label (varchar, label des tag)
Tag_ties:
- id (int, Autoincrement)
- tag_id (int, Verweis auf eine Tag-ID)
- ref_id (int, Verweis auf eine Produkt-ID)
Was ich möchte:
Erhalten Sie beispielsweise alle Produkte, die mit den Tags ID 10, 11 und 12 gekennzeichnet sind.
Diese Abfrage funktioniert nicht, da sie die Produkte mit mindestens einem der Tags zurückgibt:
select
p.name as name,
p.id as id
from
products p inner join tag_ties ties
on
p.id=ties.ref_id
where
ties.ref_id=p.id and
ties.tag_id in (10,11,12)
group by
p.id
order by
p.name asc
Sie können dieses Problem mit intersect-Anweisungen lösen. Wenn Sie für jede tag_id eine separate Auswahl treffen und diese mit Schnittpunkten verknüpfen, erhalten Sie nur die Datensätze, die mit allen drei tag_ids übereinstimmen.
Hier ist ein Referenzartikel zur Verwendung von intersect
Sie können auch eine temporäre Ansicht verwenden, um das Erscheinungsbild zu verbessern.
quelle
Die Unterabfrage aus der ausgewählten Antwort wird nicht benötigt. Um Produkte mit allen angegebenen Tag-IDs auszuwählen, kann die Abfrage einfach wie folgt erfolgen:
Um diese Idee zu erweitern, können wir auch Abfragen basierend auf den Tag-Beschriftungen in einer einzigen Aufnahme durchführen. So wählen Sie Produkte mit den Tags aus
('foo', 'bar', 'baz')
:Um es etwas zu komplizieren, können wir eine Unterabfrage verwenden, um intersection (
AND
) und union (OR
) zu mischen . Die folgende Abfrage gibt Produkte mit allen Tags der Gruppe('foo', 'bar')
und mindestens einem der Tags der Gruppe zurück('baz', 'ding')
:quelle
JOIN
? Nein, technisch gesehen nicht, aber gibt es einen Grund, es nicht zu benutzen? Und zurück zur SQL-89-Notation impliziter Verknüpfungen?