我有这个架构:
items | taxonomy | subjects
| |
ID headline | item_id subject_id | subject_id subject
-------------------------------------------------------------------------
1 information | 1 1 | 1 cities
2 here we are | 2 1 | 2 towns
3 more things | 3 2 | 3 water
4 doo dah | 3 4 | 4 telephones
| 4 1 |
| 4 3 |
我想从“items”中选择一行并使用它,包括“subjectonomy”表连接的“subject”中的所有行。例如,获取item.ID=3
会产生类似的结果:
items.ID = 3
items.headline = "more things"
subjects.subject = "towns"
subjects.subject = "telephones"
我已经开始使用此查询
SELECT
i.ID,
i.headline,
s.subject_name
FROM items i
JOIN taxonomy t
on i.ID=t.item_id
JOIN subjects s
on t.subject_id=s.subject_id
WHERE i.ID = 3
但即使有多个与该item_id相关联的值,这只会从subject_name
返回单个值。
修改
我实际上在查询上有一个LIMIT 1
,导致(如@Gordon Linoff所说)只返回一行,即使结果集中有多行对应多个主题。他的解决方案仍然很好,因为我只想返回一行。
答案 0 :(得分:3)
您的查询返回多行的主题。如果您想要单行上的主题,那么您需要某种形式的连接:
SELECT i.ID, i.headline, GROUP_CONCAT(s.subject_name) as subjects
FROM items i JOIN
taxonomy t
ON i.ID = t.item_id JOIN
subjects s
ON t.subject_id = s.subject_id
WHERE i.ID = 3
GROUP BY i.ID, i.headline;
对于一个项目,GROUP BY
是可选的,但如果您修改查询以处理多个项目,这是一个很好的形式。
答案 1 :(得分:0)
我建议您使用“union all”子句(或“union”,如果您不需要重复项)。
(SELECT
"taxonomy" As Name,
i.headline As Value
FROM items i
JOIN taxonomy t
on i.ID=t.item_id
WHERE i.ID = 3)
Union All
(SELECT
"subject" As Name,
s.subject_name As Value
FROM items i
JOIN subjects s
on t.subject_id=s.subject_id
WHERE i.ID = 3)
您可以在每个选择中添加第二个字段以指示所选项目的类型(“标题”,“主题”等)。