2012-01-30 63 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,也就是从处理丢失很大的不同行。