表中具有匹配ID值的简单MySQL表:
table 1;
pid, firstname
table 2;
id, pid, property, value
让我们说表1中有一个人参赛:
pid: 1
firstname: fred
对于每个人,有多个表2条目:
pid: 1
property: likes cats?
value: no
pid: 1
property: eye colour
value: orange
pid: 1
property: favourite food
value: sox
我想只选择许多表格中的两个条目,比如眼睛的颜色,并赞成给定人物ID的食物条目。什么样的外部联接可以实现这一目标?
SELECT `t1`.name
FROM `table1` AS t1
LEFT JOIN `table2` t2 ON `t1`.pid = `t2`.pid
WHERE `t1`.pid = 1
AND `t2`.property = 'eye colour'
我被困在这里,如何从table2获得两行并包括赞成食物? (在任何人说出来之前,我不能改变这个数据库的结构。)
感谢阅读。
答案 0 :(得分:5)
你需要离开两次加入:
SELECT
t1.name
,t2a.value as eye_color
,t2b.value as fav_food
FROM table1 t1
LEFT JOIN table2 t2a ON (t1.pid = t2a.pid AND t2a.property = 'eye colour')
LEFT JOIN table2 t2b ON (t1.pid = t2b.pid AND t2b.property = 'fav food')
WHERE t1.pid = 1
答案 1 :(得分:4)
如下:
SELECT t1.name, t2.property, t2.value
FROM table2 t2
INNER JOIN table1 t1 ON t1.pid = t2.pid
WHERE t2.pid = 1
AND t2.property IN ('eye colour','favourite food')
或者你只想要前两个,但是MySQL将它编入索引:
SELECT t1.name, t2.property, t2.value
FROM table2 t2
INNER JOIN table1 t1 ON t1.pid = t2.pid
WHERE t2.pid = 1
LIMIT 2
此处没有真正的理由使用LEFT JOIN,因为pid
中应始终定义关联的table1
。
答案 2 :(得分:2)
这个怎么样?
SELECT t.name, t.value, t3.value
FROM
(SELECT t1.name, t2.value, t1.pid
FROM table1 t1
LEFT JOIN table2 t2 ON t1.pid = t2.pid
WHERE t1.pid = 1
AND t2.property = 'eye colour') t
LEFT JOIN table2 t3 ON t.pid = t3.pid
WHERE t.pid = 1
AND t3.property = 'favourite food'
这也适用于没有“眼睛颜色”或“喜欢的食物”条目的人
答案 3 :(得分:-1)
如果你想用一个查询来做这个,那么你应该使用INNER JOIN,但我不推荐这个。如果我是你,我会先选择那个人,然后我会创建另一个查询来接收必要的table2条目。尝试我的两种解决方案,您可以选择合适的解决方案。