2011-03-04 26 views
1

我有两个简单的表计数的记录是一个而不是其他:MYSQL

用户

+----+--------+-----------+ 
| id | gender | birthdate | 
+----+--------+-----------+ 

userpreference

+----+------------------+-----------------+ 
| id | preference value | preference type | 
+----+------------------+-----------------+ 

问题:

我想查询所有未列出特定首选项值的人员,例如'shopping'。这包括所有未列出任何首选项类型的人员,以便该列可以为空,但由于userpreference的列'id'引用了用户作为一个外键,我还希望在我的数量中包括所有没有出现在第二个表中的用户(用户偏好)?

总不具备优先值“购物”作为自己的喜好价值谁的人#:

这里是我曾尝试:

SELECT 
(
SELECT COUNT(DISTINCT userpreference.id) FROM userpreference 
WHERE preferencevalue != 'shopping') 
+ 
(
SELECT COUNT(users.id) 
FROM users 
WHERE users.id NOT IN 
(SELECT userpreference.Id 
FROM userpreference) 
) 
AS'Total' 

回答

2
Select Count(*) 
From Users 
Where Not Exists (
        Select 1 
        From UserPreference As UP1 
        Where UP1.id = Users.id 
         And UP1.PreferenceValue = 'Shopping' 
        ) 
+0

这是一个有趣的方法,从内括号开始,您首先将所有具有“购物”列出的人列为自己的偏好值,然后从该结果中统计出用户表中所有未显示的人'身份证'作为支票? – Warz 2011-03-04 02:39:23

+0

@Warz - 这是一个相关的子查询,其中内部查询引用外部查询中的某些内容。如果每个用户返回一个子查询中的一行,则Exists表达式将返回true。 Exists子查询返回一行的唯一方法是给定用户至少有一个首选项,其中一个首选项行是“购物”。通过使用不存在,我说要么没有给定用户的首选项行,要么没有“购物”行。 – Thomas 2011-03-04 03:58:04

0

尝试右连接,这将包括所有不出现在第二个表中的人

SELECT * FROM Users RIGHT JOIN Userpr开启(用户。 userID =用户。 userID) WHERE preference_value = '购物'

0

试试这个:

SELECT COUNT(DISTINT U.id)来自用户的ü自然科学LEFT JOIN userpreference UP WHERE UP.preferencevalue为空或UP.preferenceValue ='购物';

LEFT JOIN应该引入所有用户的记录是否有UP记录。

+0

只有在有匹配时,左连接才会在两个记录中给出记录,我认为你正在考虑正确加入 – 2011-03-04 02:13:55

+0

下面是我基于此文档:LEFT JOIN关键字返回左表(table_name1)中的所有行,即使右表没有匹配(table_name2)。 – 2011-03-04 03:01:11

相关问题