Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Potrzebujesz pomocy z zapytaniem sql, aby znaleźć rzeczy oznaczone wszystkimi określonymi tagami

Korzystanie z 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)

Korzystanie z 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

Korzystanie z 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)

Wyjaśnienie

Sednem rzeczy jest to, że COUNT(DISTINCT t.name) musi odpowiadać liczbie nazw tagów, aby upewnić się, że wszystkie te tagi są powiązane z postem. Bez DISTINCT istnieje ryzyko, że duplikaty jednego z nazwisk mogą zwrócić liczbę 7 – więc otrzymasz fałszywy alarm.

Wydajność

Większość powie, że JOIN jest optymalne, ale JOIN ryzykuje również powielanie wierszy w zestawie wyników. EXISTS to mój następny wybór — bez podwójnego ryzyka i ogólnie szybsze wykonanie, ale sprawdzenie planu wyjaśnień ostatecznie powie, co jest najlepsze w oparciu o konfigurację i dane.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstaw wiersz do bazy danych za pomocą PreparedStatement

  2. Różnica między dwiema strukturami tabel

  3. Dlaczego wykonanie zapytania wstawiającego czasami trwa tak długo?

  4. MySQL a JSON — dlaczego?

  5. Problemy ze strefą czasową w PHP i MySQL