2015-06-17 59 views
0

我陷入了一个棘手的问题,我无法解决自己。 这是我想要实现的。SQL如何在同一张表上使用多个连接

The desired output

这甚至可能吗? 我尝试过以下查询,但我没有得到我想要的。

SELECT t1.ID, info.start_bt1, info.start_bt2, t1.ANT as BT1_VL1, t2.ANT as BT1_VL2, t3.ANT as BT2_VL1, t4.ANT as BT2_VL2 
FROM antwoorden t1 
LEFT JOIN info ON t1.ID = info.ID 

LEFT JOIN antwoorden t2 
ON t1.ID = t2.ID 
AND t2.BT = 1 AND t2.VL = 2 

LEFT JOIN antwoorden t3 
ON t1.ID = t3.ID 
AND t3.BT = 2 AND t3.VL = 1 

LEFT JOIN antwoorden t4 
ON t1.ID = t4.ID 
AND t4.BT = 2 AND t4.VL = 2 

WHERE t1.BT = 1 AND t1.VL = 1 

问题是我只得到ID 2(从所需的结果)的行。有谁知道我为什么只拿到ID 2的行,而不是全部4行?


编辑

我更新了图片所以这是一个有点清晰明白我的意思。此外,该ID是给予一个人的ID。正如你在图片中看到的,这意味着一个人可以有多行。我想要做的是将所有从一个人收集到的数据按他们的ID进行分组。我知道这种方式不是一种存储数据的好方法,但是我不能帮助它,因为有人做了这个,我不能改变它。


编辑另:这里是a sql fiddle

+1

如果你更好地解释你的表实际上意味着什么,你正在努力实现它可能的帮助。例如,我不清楚你如何从antwoorden表中将id = 1的4行合并到所需的结果表中。你打算在这个过程中执行什么逻辑?坦率地说,如果你的模式对于你如何处理这些数据是有意义的,那么它并不是非常清楚。 –

+0

如果您可以创建[SQL小提琴](http://sqlfiddle.com/) –

+0

因为您的WHERE子句WHERE t1.BT = 1 AND t1.VL = 1,您将永远不会获得ID 3或4,因为你的表中没有记录,其ID为3和4的BT和VL为1。你必须重新思考你的方法。我不明白你为什么没有得到1的ID。这应该通过,因为你对其他事情都很熟悉。 – JNevill

回答

1

尝试反过来。先从info表,然后LEFT JOIN多次以antwoorden

select i.id,i.start_bt1,i.start_bt2, 
a1.ant as "bt1_vl1", 
a2.ant as "bt1_vl2", 
a3.ant as "bt2_vl1", 
a4.ant as "bt2_vl2" 
from info i 
left join antwoorden a1 on a1.id = i.id and a1.vl=1 and a1.bt=1 
left join antwoorden a2 on a2.id = i.id and a2.vl=2 and a2.bt=1 
left join antwoorden a3 on a3.id = i.id and a3.vl=1 and a3.bt=2 
left join antwoorden a4 on a4.id = i.id and a4.vl=2 and a4.bt=2;