Sqlite - One-To-Many 关系 SELECT 查询
Sqlite - One-To-Many Relationship SELECT Query
先决条件
我的文件中有两个 table(关于黑胶唱片):
记录
ID
Title
1
Title_1
2
Title_2
样式
ID
recordId
style
1
1
Blues
2
1
Disco
3
2
Blues
4
2
Electro
(Styles.style 存储为 Integer,但此处为简单起见使用 String)
为 table 样式设置了以下条件:
Styles.recordId = Records.ID 对于每个给定的黑胶唱片
->这是查找与一张特定黑胶唱片相关的所有样式所必需的
因此,存储了两张黑胶唱片:
Title_1 有两种风格 Blues, Disco
Title_2 有两种风格的 Blues、Electro
问题
在我的 SELECT 查询中,我想查找具有特定风格的黑胶唱片
查找具有一种风格的标题
如果我想找到一种特定风格的黑胶唱片,这似乎很简单。
我使用:
SELECT Records.Title
FROM Records
JOIN Styles ON Styles.recordId = Records.ID
WHERE Styles.style=Disco
想要的结果:
(Title_1)
查找更多样式的标题
比方说,我想找到所有具有以下风格的标题(Blues AND Electro)
使用之前的语句并仅添加另一个语句似乎不起作用:
SELECT Records.Title
FROM Records
JOIN Styles ON Styles.recordId = Records.ID
WHERE Styles.style=Blues AND Styles.style=Electro
这不起作用,因为列 Styles.style 永远不会同时包含两种样式。
如何告诉 SQLite return 所有满足要求的标题?输出应该是
(Title_2)
编辑:修复了 tables 不呈现
为此,您需要根据 HAVING
子句中的条件为您想要的样式和聚合过滤结果集的行,即对于一个标题,两种样式都存在:
SELECT r.id, r.Title
FROM Records r JOIN Styles s
ON s.recordId = r.ID
WHERE s.style IN ('Blues', 'Electro')
GROUP BY r.id, r.Title
HAVING COUNT(*) = 2;
我假设在 table style
中 recordId
和 style
列的组合是唯一的。
先决条件
我的文件中有两个 table(关于黑胶唱片):
记录
ID | Title |
---|---|
1 | Title_1 |
2 | Title_2 |
样式
ID | recordId | style |
---|---|---|
1 | 1 | Blues |
2 | 1 | Disco |
3 | 2 | Blues |
4 | 2 | Electro |
(Styles.style 存储为 Integer,但此处为简单起见使用 String)
为 table 样式设置了以下条件:
Styles.recordId = Records.ID 对于每个给定的黑胶唱片
->这是查找与一张特定黑胶唱片相关的所有样式所必需的
因此,存储了两张黑胶唱片:
Title_1 有两种风格 Blues, Disco
Title_2 有两种风格的 Blues、Electro
问题
在我的 SELECT 查询中,我想查找具有特定风格的黑胶唱片
查找具有一种风格的标题
如果我想找到一种特定风格的黑胶唱片,这似乎很简单。
我使用:
SELECT Records.Title
FROM Records
JOIN Styles ON Styles.recordId = Records.ID
WHERE Styles.style=Disco
想要的结果:
(Title_1)
查找更多样式的标题
比方说,我想找到所有具有以下风格的标题(Blues AND Electro)
使用之前的语句并仅添加另一个语句似乎不起作用:
SELECT Records.Title
FROM Records
JOIN Styles ON Styles.recordId = Records.ID
WHERE Styles.style=Blues AND Styles.style=Electro
这不起作用,因为列 Styles.style 永远不会同时包含两种样式。
如何告诉 SQLite return 所有满足要求的标题?输出应该是
(Title_2)
编辑:修复了 tables 不呈现
为此,您需要根据 HAVING
子句中的条件为您想要的样式和聚合过滤结果集的行,即对于一个标题,两种样式都存在:
SELECT r.id, r.Title
FROM Records r JOIN Styles s
ON s.recordId = r.ID
WHERE s.style IN ('Blues', 'Electro')
GROUP BY r.id, r.Title
HAVING COUNT(*) = 2;
我假设在 table style
中 recordId
和 style
列的组合是唯一的。