sql >> Databáze >  >> RDS >> Mysql

Potřebujete pomoc s dotazem sql, abyste našli věci označené všemi zadanými značkami

Pomocí 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)

Použití 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

Pomocí 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)

Vysvětlení

Jádrem věci je, že COUNT(DISTINCT t.name) musí odpovídat počtu názvů štítků, aby bylo zajištěno, že všechny tyto štítky souvisejí s příspěvkem. Bez DISTINCT existuje riziko, že duplikáty jednoho ze jmen mohou vrátit počet 7 – takže byste měli falešně pozitivní výsledek.

Výkon

Většina vám řekne, že JOIN je optimální, ale JOINy ​​také riskují duplikaci řádků v sadě výsledků. EXISTS by byla moje další volba – žádné duplicitní riziko a obecně rychlejší provádění, ale kontrola plánu vysvětlení vám nakonec řekne, co je nejlepší na základě vašeho nastavení a dat.



  1. 6 způsobů, jak převést řetězec na hodnotu data/času na serveru SQL

  2. PDO + MySQL vždy vrací řetězce, ale co MsSQL?

  3. Hodnota NENÍ NULL v codeigniter

  4. Můj DBA je nemocný – Tipy pro přepnutí databáze při selhání databáze pro správce systému