2012-01-30 37 views
2

我正試圖從2個表映射的id中獲取記錄,其中第二個表中可能有一行缺失。MYSQL:將缺失的行遺忘到結果中

我在第二個表上有一個名爲name的列,它包含一個字符串值。我需要提取的值是'訂閱',但這並不總是存在於表中。有可能有不同的值,我不想提取這個列。

是否可以檢查值是否存在以及是否不向所有字段輸出空值。

到目前爲止,我有這個返回的所有記錄

select COUNT(*) 
from PUser a, PAttribute b 
where exists (select null 
       from PAttribute c 
       where c.name = 'subscriptions' or c.name is null) 
    and a.id = b.userid; 

希望解釋它。

編輯

PUser表

ID等 列

PAttribute表

用戶ID映射到PUser.id 名

現在用戶ID可以在每個具有多個行一個不同的名稱,例如'訂閱','來源','等'等'

我想要獲取所有在名稱列中具有值「訂閱」的用戶,或者如果該行不存在「訂閱」值,因爲它們可能沒有。

如果他們沒有這行,輸出應該爲空。

編輯2:

曾爲了這一點,我需要

select COUNT(*),(select b.stringValue from PAttribute b where b.userid = a.id and b.name = 'subscriptions') from PUser a order by a.id desc; 
+0

我不明白(select null ...)子查詢;它與查詢其餘部分中使用的記錄無關,因此詢問ANY記錄是否具有「訂閱」或名稱爲NULL。 – 2012-01-30 14:41:08

回答

0

你的例子是使用隱式連接,其是內部聯接。這意味着只有在兩個表中都存在一行時纔會返回結果。相反,您需要使用左連接。查詢改成這樣:

select COUNT(*) 
from PUser a LEFT JOIN PAttribute b ON a.id = b.userID 
where exists (select null 
       from PAttribute c 
       where c.name = 'subscriptions' or c.name is null); 

或(不完全知道你想要的行爲是什麼),這可能會爲你工作:

SELECT count(*) 
FROM PUser a LEFT JOIN PAttribute b ON a.id = b.userID 
WHERE b.name = 'subscriptions' OR b.name IS NULL; 
0

如果要排除不包含「訂閱行',您可以使用JOIN ON表單併爲了保留來自PUser的行,即使沒有與名稱設置爲'subrciptions'的PAttribute相匹配的行,從而獲得空字段,也可以利用OUTER JOIN。

select COUNT(*) 
from PUser a OUTER JOIN PAttribute b ON (a.id = b.userid AND b.name = 'subscriptions') 
; 

這是從您的查詢不同的一點:EXISTS較少perfomant,此外,該SELECT在EXISTS做搜索PAttribute一排名稱爲null,也就是從處理丟失很大的不同行。