Frage

Ich habe einige Probleme mit einer kniffligen SQL-Abfrage.

In meiner MySQL-Datenbank gibt es die Tabellen Themen, Tags und tags_topics sie anzuschließen. Ich möchte Themen holen, die die gleichen angegebenen Tags teilen. Zum Beispiel, sagen wir, ich habe 3 Tags mit ids 1, 2 und 3, ich will alle Themen holen, die Tag 1 haben, 2 und 3 zu ihnen verbunden sind. Die Themen können auch andere Tags, sondern müssen alle angegebenen Tags haben.

Helfen Sie mir denken plz xD

EDIT: Gefunden eine Lösung unter Verwendung von GROUP BY in dieser Frage: Fetching nur Zeilen, die alle Einträge in einer anderen Tabelle (SQL) entsprechen Wenn jemand eine elegantere Lösung hat, bitte schreiben:)

War es hilfreich?

Lösung

JOIN Lösung:

SELECT t.*
FROM topics t
 JOIN tags_topics t1 ON (t.id = t1.topicId AND t1.tagId = 1)
 JOIN tags_topics t2 ON (t.id = t2.topicId AND t2.tagId = 2)
 JOIN tags_topics t3 ON (t.id = t3.topicId AND t3.tagId = 3)

GROUP BY Lösung:

Beachten Sie, dass Sie alle t.* Spalten in der GROUP BY Klausel zur Liste müssen, es sei denn, Sie MySQL oder SQLite verwenden.

SELECT t.*
FROM topics t JOIN tags_topics tt 
  ON (t.id = tt.topicId AND tt.tagId IN (1,2,3))
GROUP BY t.id, ...
HAVING COUNT(*) = 3;

Subquery Lösung:

SELECT t.*
FROM topics t
WHERE t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 1)
  AND t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 2)
  AND t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 3);

Modifizierte GROUP BY Lösung:

Vereinfacht GROUP BY Klausel durch Suche in einer Unterabfrage zu isolieren.

SELECT t.*
FROM topics t
WHERE t.id IN (
  SELECT tt.topicId FROM tags_topics tt 
  WHERE tt.tagId IN (1,2,3))
  GROUP BY tt.id HAVING COUNT(*) = 3
);

Andere Tipps

SELECT 
    topic_id
FROM
    tags_topics
WHERE
    tag_id IN (1,2,3)
GROUP BY
    topic_id
HAVING
    COUNT(*) > 2  /* or use COUNT(*) = 3 if you know that there cannot be duplicates in the junction table */
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top