2012-04-13 46 views
1

我试图让我的两个表之间使用LEFT OUTER JOIN返回NULL值的SQL查询。使用外部连接返回多个空值

一个表格包含用户信息,另一个表格包含唱名信息。基本上,我试图生成一个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 
+0

你有没有列出所有rollcalls的表? – ESG 2012-04-14 04:51:45

回答

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。

+0

我只是返回用户ID作为测试您的似乎工作正常它由于某种原因返回了一个rollcallid为0的行,但我只是添加了WHERE r1.rollcallid!= 0来摆脱那一行 非常感谢! – Sharpk1ll3r 2012-04-14 14:57:26

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

那一个返回所有1,253行,并用2089代替实际用户标识。 – Sharpk1ll3r 2012-04-14 01:12:50

0

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

+0

我确实尝试过,它只是返回一个空集。 :( – Sharpk1ll3r 2012-04-14 01:10:16

+0

看起来像fleetmgr_members是一个红色鲱鱼和一点加入考虑:SELECT * FROM fleetmgr_rollcall_log WHERE userid = 2089 AND状态为空AND rollcallid IN(1,5); – scorpdaddy 2012-04-14 02:22:03

+0

另一个空集。:/ – Sharpk1ll3r 2012-04-14 03:04:51

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;