我想这是一个常见的设置,但由于我没有做太多的 SQL 工作,所以我无法理解这个...所以,我有一堆具有某些功能的歌曲(音乐风格、心情等),我想选择具有这些特征的歌曲(例如快乐和欣快的歌曲)。
SONG
+----+----------+
| id | title |
+----+----------+
| 1 | song #1 |
+----+----------+
| 2 | song #2 |
+----+----------+
FEATURE
+----+-------+----------+
| id | name | value |
+----+-------+----------+
| 1 | mood | sad |
+----+-------+----------+
| 2 | mood | happy |
+----+-------+----------+
| 3 | mood | euphoric |
+----+-------+----------+
| 4 | style | rock |
+----+-------+----------+
| 5 | style | jazz |
+----+-------+----------+
SONG_FEATURE
+---------+------------+
| song_id | feature_id |
+---------+------------+
| 1 | 1 |
+---------+------------+
| 2 | 1 |
+---------+------------+
| 2 | 2 |
+---------+------------+
我想通过 AND
条件选择具有某些特征的所有歌曲。我会将此查询用于 OR
情况。
SELECT
s.*,
f.*
FROM
song_feature sf
LEFT JOIN song s ON s.id = sf.song_id
LEFT JOIN feature f ON f.id = sf.feature_id
WHERE
(
f.name = 'style'
AND f.value = 'pop'
)
OR /* <-- this works, but I would like an AND condition */
(
f.name = 'style'
AND f.value = 'pop'
)
GROUP BY sf.song_id;
但这显然不适用于 AND
条件,所以我想我在这里走错了路......任何提示将不胜感激。
最佳答案
如果您过滤连接的结果集并在 HAVING 子句中设置条件,则可以通过聚合来实现:
SELECT s.id, s.title
FROM SONG s
INNER JOIN SONG_FEATURE sf ON sf.song_id = s.id
INNER JOIN FEATURE f ON f.id = sf.feature_id
WHERE (f.name, f.value) IN (('mood', 'sad'), ('mood', 'happy'))
GROUP BY s.id, s.title
HAVING COUNT(DISTINCT f.name, f.value) = 2
请参阅demo .
结果:
> id | title
> -: | :------
> 2 | song #2
关于mysql - 如何使用特征表查询多对多关系(AND条件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65258159/