Question

J'ai des problèmes avec une requête SQL complexe.

La base de données MySQL contient les rubriques relatives aux tables, les balises et les balises_topics permettant de les rejoindre. Je veux récupérer des sujets qui partagent les mêmes balises spécifiées. Par exemple, disons que j'ai 3 balises avec les identifiants 1, 2 et 3, je veux aller chercher toutes les rubriques associées aux balises 1, 2 et 3. Les sujets peuvent avoir d'autres tags, mais doivent avoir tous les tags spécifiés.

Aidez-moi à penser plz xD

EDIT: vous avez trouvé une solution à l'aide de GROUP BY dans cette question: Extraire uniquement les lignes correspondant à toutes les entrées d'une table jointe (SQL) Si quelqu'un a une solution plus élégante, postez s'il vous plaît:)

Était-ce utile?

La solution

solution JOIN :

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)

Solution GROUP BY :

Notez que vous devez répertorier toutes les colonnes t. * de la clause GROUP BY , sauf si vous utilisez MySQL ou SQLite.

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;

Solution de sous-requête:

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);

Solution GROUP BY modifiée:

Simplifie la clause GROUP BY en isolant la recherche dans une sous-requête.

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
);

Autres conseils

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 */
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top