mysql - 如何使用特征表查询多对多关系(AND条件)

标签 mysql sql many-to-many

我想这是一个常见的设置,但由于我没有做太多的 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/

相关文章:

sql - 在 SQL 中输入数据时处理循环引用

java - Hibernate:@ManyToMany 关系中对象集的传递持久性

mysql - 如何通过一个查询删除两个链接表(多对多关系)中的数据?

mySQL:我可以使 count() 遵守限制子句吗?

mysql - 根据 like 查询中的出现获取记录

c# - sqlite-net like 语句崩溃

mysql - MySQL 5 数据库上的错误 1064

python - Django:ManyToMany 能够排序并添加/删除关系?

php - 从 Linux 主机连接 Mysql PDO/MySqli

mysql - 获取从 CDbCriteria 生成的 SQL