我有一个包含用户ID,期间ID和数量的表格
User Period Qty
---- ------ ---
1 11201 3
1 11202 2
1 11203 5
2 11202 4
2 11203 1
注意:用户2在期间11202开始,因此他/她没有期间11201的行
我只需要从最新的期间获得用户...
SELECT User FROM table WHERE Period = 11203
...然后在同一个表格中使用这些用户ID为两个用户获取Period 11201和11202 Qty。
问题:我需要在期间11201中看到用户2的(null)
数量。像这样:
User Period Qty
---- ------ -----
1 11201 3
1 11202 2
2 11201 (null)
2 11202 4
我无法弄清楚查询/连接来实现它。到目前为止,我有这个,但可以预见它只给我3行(用户1,期间11201/11202和用户2,期间11202):
SELECT a.User, a.Period, a.Qty
FROM (SELECT User FROM table WHERE Period = 11203) b
LEFT JOIN table a
ON b.User = a.User
WHERE a.Period BETWEEN 11201 AND 11202
答案 0 :(得分:3)
您的where
子句会过滤掉a.Period
为空的行。将其移至on
子句:
LEFT JOIN table a
ON a.User = b.User
AND a.Period = p.Period
AND a.Period BETWEEN 11201 AND 11202
或明确接受null
值:
WHERE a.Period is null OR a.Period BETWEEN 11201 AND 11202
答案 1 :(得分:1)
您需要获得所有必需的时间段并首先与用户制作这些产品的笛卡尔积,然后将外部连接到:
SELECT b.User, p.Period, a.Qty
FROM (SELECT User FROM table WHERE Period = 11203) b
CROSS JOIN (SELECT DISTINCT Period FROM table
WHERE Period BETWEEN 11201 AND 11202) p
LEFT JOIN table a
ON a.User = b.User
AND a.Period = p.Period
另请注意,SELECT需要从外部表中获取User和Period而不是内部表,否则所有将在缺少用户的行上为null。
答案 2 :(得分:0)
您是否查看了LEFT / RIGHT和OUTER / INNER连接之间的所有差异? http://dev.mysql.com/doc/refman/5.0/en/join.html