2016-10-08 49 views
2

這可能是簡單的,但我不能看到問題...MySQL的左外連接沒有給正確的結果

我有一個包含標題的郵件列表的索引MySQL表。 該表是列表。 然後有一個用戶表和一個訂閱表。 訂閱表包含將用戶鏈接到其郵件列表的簡單條目。

關注的欄目有:

USERS u_id 
LISTS l_id 
SUBS s_id, u_id, l_id 

因此,當用戶23加入郵件列表7,在SUBS創建的條目是:

s_id: 1 -- 
u_id: 23 -- 
l_id: 7 

這裏的問題: 當用戶正在尋找在他們的訂閱中,我需要顯示一張顯示所有郵件列表的表格,每個郵件列表都有一個勾選的複選框,如果他們已經訂閱了該列表。

我的SQL,這是不對的,但我不知道怎麼了,就在這裏:

SELECT l.l_id, l.l_name, l.l_desc, 
CASE 
WHEN s.u_id = '23' THEN 1 ELSE 0 
END 
FROM lists as l 
LEFT OUTER JOIN 
subs as s 
ON s.l_id = l.l_id 
GROUP BY l.l_id ASC 

這應該是呈現1S打勾相關盒和0給他們留下空。

但是這種行爲很奇怪,因爲當我從subs中得到*時,我看到了所有的期望值。 但是,上述SQL返回存在訂閱的幾個空白複選框。甚至更奇怪的是,如果所有框都打勾,那麼SQL根本沒有返回。

我一直在爭取這件事太久了。有誰能提供解決方案嗎?

非常感謝!

回答

2

問題不是LEFT JOIN,它是聚合。您需要SELECT中的聚合函數。

但是,我不認爲你需要聚合。假設一個用戶ID只能在lists出現一次對於一個給定的名單:

SELECT l.l_id, l.l_name, l.l_desc, 
     (s.l_id is not null) as flag 
FROM lists l LEFT OUTER JOIN 
    subs s 
    ON s.l_id = l.l_id AND s.u_id = 23; 

可以快遞查詢自己的方式(採用聚集的)。它看起來像:

SELECT l.l_id, l.l_name, l.l_desc, 
     MAX(s.u_id = 23) as flag 
FROM lists l LEFT OUTER JOIN 
    subs s 
    ON s.l_id = l.l_id 
GROUP BY l.l_id, l.l_name, l.l_desc; 

您還可以使用MAX(CASE s.u_id = 23 THEN 1 ELSE 0 END),但MySQL的布爾速記是更加方便和可讀性。

+0

我知道這已經過時了,但我只是想謝謝你這個答案。 – Kane