我需要什么样的MySQL加入?

时间:2012-03-15 14:38:55

标签: mysql outer-join

表中具有匹配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获得两行并包括赞成食物? (在任何人说出来之前,我不能改变这个数据库的结构。)

感谢阅读。

4 个答案:

答案 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条目。尝试我的两种解决方案,您可以选择合适的解决方案。