sql >> Database teknologi >  >> RDS >> Mysql

Har brug for hjælp til sql-forespørgsel for at finde ting, der er mærket med alle specificerede tags

Brug af IN:

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)

Brug af en JOIN

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

Brug af EXISTS

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)

Forklaring

Tingenes kerne er, at COUNT(DISTINCT t.name) skal matche antallet af tagnavne for at sikre, at alle disse tags er relateret til indlægget. Uden DISTINCT er der en risiko for, at dubletter af et af navnene kan returnere et antal på 7 - så du vil have en falsk positiv.

Ydeevne

De fleste vil fortælle dig, at JOIN er optimal, men JOIN'er risikerer også at duplikere rækker i resultatsættet. EKSISTERER ville være mit næste valg - ingen dobbeltrisiko og generelt hurtigere eksekvering, men at tjekke forklaringsplanen vil i sidste ende fortælle dig, hvad der er bedst baseret på din opsætning og dine data.



  1. Python SQL – Sådan bruger du SQLite-, MySQL- og PostgreSQL-databaserne med Python

  2. Guide til designdatabase til afstemning og undersøgelse i MySQL

  3. Find ud af, hvorfor en e-mail ikke kunne sendes i SQL Server (T-SQL)

  4. Sådan opretter du en tabel i MySQL Workbench ved hjælp af GUI