sql >> Database >  >> RDS >> Mysql

Hulp nodig bij sql-query om dingen te vinden die zijn getagd met alle opgegeven tags

IN gebruiken:

SELECT p.*
  FROM POSTS p
 WHERE p.id IN (SELECT tg.post_id
                  FROM TAGGINGS tg
                  JOIN TAGS t ON t.id = tg.tag_id
                 WHERE t.name IN ('Cheese','Wine','Paris','Frace','City','Scenic','Art')
              GROUP BY tg.post_id
                HAVING COUNT(DISTINCT t.name) = 7)

Een JOIN gebruiken

SELECT p.*
  FROM POSTS p
  JOIN (SELECT tg.post_id
          FROM TAGGINGS tg
          JOIN TAGS t ON t.id = tg.tag_id
         WHERE t.name IN ('Cheese','Wine','Paris','Frace','City','Scenic','Art')
      GROUP BY tg.post_id
        HAVING COUNT(DISTINCT t.name) = 7) x ON x.post_id = p.id

EXISTS gebruiken

SELECT p.*
  FROM POSTS p
 WHERE EXISTS (SELECT NULL
                 FROM TAGGINGS tg
                 JOIN TAGS t ON t.id = tg.tag_id
                WHERE t.name IN ('Cheese','Wine','Paris','Frace','City','Scenic','Art')
                  AND tg.post_id = p.id
             GROUP BY tg.post_id
               HAVING COUNT(DISTINCT t.name) = 7)

Uitleg

De crux is dat de COUNT(DISTINCT t.name) moet overeenkomen met het aantal tagnamen om ervoor te zorgen dat al die tags gerelateerd zijn aan het bericht. Zonder de DISTINCT bestaat het risico dat duplicaten van een van de namen een telling van 7 kunnen opleveren, zodat u een vals positief resultaat krijgt.

Prestaties

De meesten zullen je vertellen dat de JOIN optimaal is, maar JOIN's lopen ook het risico dat rijen in de resultatenset worden gedupliceerd. BESTAAT zou mijn volgende keuze zijn - geen dubbel risico, en over het algemeen snellere uitvoering, maar het controleren van het uitlegplan zal u uiteindelijk vertellen wat het beste is op basis van uw instellingen en gegevens.



  1. SQL JOINs-zelfstudie met voorbeelden

  2. EEE MMM dd HH:mm:ss ZZZ jjjj datumnotatie naar java.sql.Datum

  3. Negatieve waarden converteren van FROM_UNIXTIME

  4. Hoe genereer je een dynamische sequentietabel in MySQL?