使用外部联接返回多个空值

时间:2012-04-13 23:22:48

标签: mysql join null outer-join

我正在尝试使用两个表之间的LEFT OUTER JOIN来获取SQL查询以返回NULL值。

一个表包含用户信息,另一个表包含点名信息。基本上,我正在尝试生成一个HTML表来显示是否有人为每个月签署了点名。如果该值为NULL,则表示它们在该点名时不是成员。

我现在遇到的问题是查询只返回一个NULL值,即使它们不是多个滚动调用的成员。这是我正在使用的查询,其中用户不是多个点名调用的成员:

SELECT m.userid, r.status, r.rollcallid
FROM fleetmgr_members AS m
     LEFT OUTER JOIN fleetmgr_rollcall_log AS r 
     ON m.userid = r.userid AND r.rollcallid IN(1, 5)
WHERE m.userid = 2089
ORDER BY m.currentName, r.rollcallid;

此查询返回:

userid  status  rollcallid
2089    NULL    NULL

我希望它返回:

userid  status  rollcallid
2089    NULL    1
2089    NULL    5

出于某种奇怪的原因,实现我想要它返回的东西已经让我感到非常难过 - 所以提前感谢您提供的任何帮助。

fleetmgr_rollcall_log表:

 id     rollcallid  userid    date_signed   status  activity        comments    
  2     1           652       1330563886    signed  6-8 hrs/week    -
  29    1           2462      1330565521    signed  9-11 hrs/week   -
  1823  5           731       1333300321    signed  0-2 hrs/week    -
  2293  5           166       1333901983    exempt  0-2 hrs/week    -

fleetmgr_members表:

 id     userid      currentName
 1          3       SomeUsername
 2          5       DifferentUsername

4 个答案:

答案 0 :(得分:1)

这样的事情

SELECT r1.rollcallid, r2.status
FROM (
    SELECT DISTINCT rollcallid
    FROM fleetmgr_rollcall_log
    ) AS r1 
 LEFT JOIN fleetmgr_rollcall_log AS r2 
 ON r1.rollcallid=r2.rollcallid AND r2.userid=2089
ORDER BY r1.rollcallid;

我没有返回任何用户数据,因为您在示例结果中获得的唯一用户数据是您在查询中已经知道的user_id。

答案 1 :(得分:0)

试试这个

SELECT m.userid, r.status, r.rollcallid
FROM fleetmgr_members  m, fleetmgr_rollcall_log  r 
WHERE m.userid = 2089  AND r.rollcallid IN(1, 5)
ORDER BY m.currentName, r.rollcallid;

那么这个(使用CROSS JOIN):

SELECT m.userid, r.status, r.rollcallid
FROM fleetmgr_members  m cross join fleetmgr_rollcall_log  r 
WHERE m.userid = 2089  AND r.rollcallid IN(1, 5)
ORDER BY m.currentName, r.rollcallid;

答案 2 :(得分:0)

将r.rollcallid IN(1,5)移动到where子句,而不是join子句。

答案 3 :(得分:0)

为什么这不起作用?

SELECT m.userid, r.status, r.rollcallid
FROM fleetmgr_members AS m
     LEFT OUTER JOIN fleetmgr_rollcall_log AS r 
     ON m.userid = r.userid 
WHERE m.userid = 2089 AND r.rollcallid IN(1, 5)
ORDER BY m.currentName, r.rollcallid;