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

Pilih dalam hubungan banyak-ke-banyak di MySQL

Ada dua cara untuk melakukan ini. Saya lebih suka cara pertama, yaitu self-join untuk setiap tag:

SELECT l.*
FROM Locations l
JOIN LocationsTagsAssoc a1 ON a1.LocationID = l.ID
JOIN Tags t1 ON a1.TagID = t1.ID AND t1.Name = ?
JOIN LocationsTagsAssoc a2 ON a2.LocationID = l.ID
JOIN Tags t2 ON a2.TagID = t2.ID AND t2.Name = ?
JOIN LocationsTagsAssoc a3 ON a3.LocationID = l.ID
JOIN Tags t3 ON a3.TagID = t3.ID AND t3.Name = ?;

Cara lain juga berfungsi, tetapi menggunakan GROUP BY di MySQL cenderung menimbulkan tabel sementara dan kinerjanya lambat:

SELECT l.*
FROM Locations l
JOIN LocationsTagsAssoc a ON a.LocationID = l.ID
JOIN Tags t ON a.TagID = t.ID
WHERE t.Name IN (?, ?, ?)
GROUP BY l.ID
HAVING COUNT(*) = 3;

Komentar ulang dari @Erikoenig:

Jika Anda ingin memastikan tidak ada tag tambahan, Anda dapat melakukannya dengan cara ini:

SELECT l.*
FROM Locations l
JOIN LocationsTagsAssoc a ON a.LocationID = l.ID
JOIN Tags t ON a.TagID = t.ID
GROUP BY l.ID
HAVING COUNT(*) = 3 AND SUM(t.Name IN (?, ?, ?)) = 3;

Menghapus klausa WHERE memungkinkan tag lain dihitung, jika ada. Jadi COUNT() mungkin lebih besar dari 3.

Atau jika hitungannya tepat tiga tag, tetapi beberapa dari ketiga tag tersebut bukan tag yang benar, maka kondisi SUM() pada klausa HAVING memastikan bahwa ketiga tag yang Anda inginkan ada dalam grup.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. COALESCE di laravel

  2. Mysql:Urutan hasil dengan pilih <fieldname> dari berbeda dengan urutan hasil dengan pilih * dari

  3. MYSQL menonaktifkan Auto-Trim

  4. Apakah mungkin menggunakan Variabel Buatan Pengguna MySql di .NET MySqlCommand?

  5. Rekursif termasuk Sequelize?