Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Butuh bantuan dengan kueri sql untuk menemukan hal-hal yang ditandai dengan semua tag yang ditentukan

Menggunakan DI:

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)

Menggunakan GABUNG

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

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

Penjelasan

Intinya adalah bahwa COUNT(DISTINCT t.name) harus cocok dengan jumlah nama tag untuk memastikan bahwa semua tag tersebut terkait dengan postingan. Tanpa DISTINCT, ada risiko duplikat salah satu nama dapat menghasilkan 7 hitungan--sehingga Anda mendapatkan hasil positif palsu.

Kinerja

Sebagian besar akan memberi tahu Anda bahwa GABUNG itu optimal, tetapi GABUNG juga berisiko menduplikasi baris di hasil. EXISTS akan menjadi pilihan saya berikutnya--tidak ada risiko duplikat, dan umumnya eksekusi lebih cepat, tetapi memeriksa rencana penjelasan pada akhirnya akan memberi tahu Anda apa yang terbaik berdasarkan penyiapan dan data Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. database codeigniter pindah ke tabel lain

  2. mysql recursive(tree) parent child kategori

  3. Hak istimewa pengguna MySQL di server bersama

  4. Bagaimana saya bisa melihat kueri MySQL langsung?

  5. LINQ ke SQL beberapa tabel kiri luar bergabung