我有两个简单的表计数的记录是一个而不是其他: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'
这是一个有趣的方法,从内括号开始,您首先将所有具有“购物”列出的人列为自己的偏好值,然后从该结果中统计出用户表中所有未显示的人'身份证'作为支票? – Warz 2011-03-04 02:39:23
@Warz - 这是一个相关的子查询,其中内部查询引用外部查询中的某些内容。如果每个用户返回一个子查询中的一行,则Exists表达式将返回true。 Exists子查询返回一行的唯一方法是给定用户至少有一个首选项,其中一个首选项行是“购物”。通过使用不存在,我说要么没有给定用户的首选项行,要么没有“购物”行。 – Thomas 2011-03-04 03:58:04