2012-03-15 114 views
2

简单MySQL表与跨表匹配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

这是什么查询输出? – 2012-03-15 14:41:30

+1

你试图做的是“旋转一个实体属性值表”。 – biziclop 2012-03-15 14:43:17

+0

是的,大家都知道,这不是那么明显; P – jwbensley 2012-03-15 15:39:04

回答

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这里,因为要经常为table1中定义的关联pid

+1

我爱你的第一个答案,IN,这是好东西! :)也是的,它应该是一个INNER JOIN在这里。谢谢! – jwbensley 2012-03-15 15:22:28

-1

如果你想用一个查询来做到这一点,那么你应该使用INNER JOIN,但我不建议这样做。如果我是你,我会先选择那个人,然后我会创建另一个查询来接收必要的table2条目。试试我的两个解决方案,你可以为你选择合适的解决方案。

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' 

这也将努力为没有一个“睛彩”或“最喜爱的食物”条目

+0

您的查询中有语法错误,但总体思路是正确的。子句的正确顺序是:SELECT - FROM - JOIN - WHERE ..... **不:(select-from-join-where-join-where)**并且您不能在别名标识符中使用空格。 – Johan 2012-03-15 14:49:04

+0

@Johan摆脱了特殊的字符。谢谢! – 2012-03-15 14:52:06

+0

艾米特,这是'唯一的部分是正确的(虽然不是真的有必要) – Johan 2012-03-15 14:54:01

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 
+0

+1。我只是好奇你为什么决定两次加入表格而不是使用OR? – 2012-03-15 14:58:58

+1

@Ben,因为我在旋转桌子。如果我只是使用'或',那么每个pid会有多行,现在每个pid只有一行。 – Johan 2012-03-15 15:22:47

+0

ahhh,没有注意到。谢谢。 – 2012-03-15 15:30:19