sql >> Databasteknik >  >> RDS >> Mysql

Välj i en många-till-många-relation i MySQL

Det finns två sätt att göra detta. Jag föredrar det första sättet, som är att själv gå med för varje tagg:

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 = ?;

Det andra sättet fungerar också, men med GROUP BY i MySQL tenderar att medföra en tillfällig tabell och prestandan är långsam:

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;

Om kommentar från @Erikoenig:

Om du vill vara säker på att det inte finns några extra taggar kan du göra det så här:

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;

Genom att ta ut WHERE-satsen kan andra taggar räknas, om det finns några. Så COUNT() kan vara större än 3.

Eller om antalet är exakt tre taggar, men några av dessa tre inte är de korrekta taggar, då ser SUM()-villkoret i HAVING-satsen till att alla tre taggar du vill ha finns i gruppen.



  1. Hur utför man en SQLite-fråga i en Android-applikation?

  2. Driver.getConnection hänger sig med SQLServer-drivrutinen och Java 1.6.0_29

  3. PDO returnerar heltalskolumner som String i PHP5.4

  4. 4 sätt att få en lista över scheman i SQL Server Agent (T-SQL)