2016-12-27 4 views
-2

I Tabellen haben:SQL wählen Sie alle Elemente mit entsprechenden Tags zeigen

item(id_item, content) 
tags(id_tag, tag_name) 
items_tags(id_item, id_tag) 

Ich habe Daten:

item(1, 'content of item') 
tags(1, 'bad'), tags(2, 'good'), tags(3, 'best') 
items_tags(1, 2), items_tags(1, 3) 

mit so einem anderen Posten Worten id 1 Tags gut und am besten hat. Wie schreibe ich einen sql, um mir alle Artikel anzuzeigen, die Tags gut und am besten haben?

+1

Sie etwas recherchiert? Versucht, irgendeinen eigenen Code zu schreiben? – dfundako

+0

NUR 'gut und gut' *** oder ***' gut und gut'? (aber könnte auch schlecht sein, faul, oder "sie sind plaid gegangen") 'schließen Sie sich den Tischen an. Wo Tags in (YourList) Group by Item.ID mit count (*) = #ofTagsinWhereclause oder replace = #ofTags ... with (Wählen Sie count (distinct Tag_name) aus Tags mit tag_name in ('good', 'best') ' – xQbert

+0

Welches DBMS verwendest du? –

Antwort

1

Einfach. join, subquery und IN

SELECT * 
FROM item i 
WHERE i.id_item IN 
    (SELECT it.id_item 
    FROM items_tags it 
    INNER JOIN tags t 
    ON it.id_tag  = t.id_tag 
    WHERE t.tag_name IN ('good', 'best') 
    GROUP BY it.id_item 
    HAVING COUNT(DISTINCT t.tag_name) >= 2 
) t; 

hier ist äquivalent ohne Unterabfrage:

SELECT i.id_item 
FROM item i 
INNER JOIN items_tags it 
ON i.id_item = it.id_item 
INNER JOIN tags t 
ON it.id_tag  = t.id_tag 
WHERE t.tag_name IN ('good', 'best') 
GROUP BY i.id_item 
HAVING COUNT(DISTINCT t.tag_name) >= 2; 
+0

Das funktioniert aber nur, wenn contains gut genug ist.Wenn t.tag_name auch 'Majestic' für diese i.id_items enthielt, wollten wir nur solche, die nur gut waren, am besten. Dann würde das nicht funktionieren aber wir wissen nicht, was das OP noch will. – xQbert

+0

danke für die Antwort, obwohl es nicht ganz das ist, was ich wollte. Diese Abfrage wird nach allen Artikeln suchen, die den Tag 'gut' oder 'am besten' haben die haben beide Tags "gut" und "beste" –

+0

* kichern * danke Kamil: P – xQbert

Verwandte Themen