4

我有一个多对多的关系

--------------------
| user_id | name   |
--------------------
| 1       | user1  |
--------------------
| 2       | user2  |
--------------------
| 3       | user3  |
--------------------


--------------------
| type_id | name   |
--------------------
| 1       | type1  |
--------------------
| 2       | type2  |
--------------------
| 3       | type3  |
--------------------

---------------------
| user_id | type_id |
---------------------
| 1       | 1       |
---------------------
| 1       | 2       |
---------------------
| 1       | 3       |
---------------------
| 2       | 1       |
---------------------
| 2       | 2       |
---------------------
| 3       | 3       |
---------------------

我正在尝试构建一个查询,以便如果我的用户属于 3 类,则根本不返回该用户。到目前为止,我有一个查询排除了类型 3 的用户,但如果其他类型也分配给他们,则它们将被返回。

SELECT COUNT(DISTINCT `t`.`user_id`) 
FROM `user` `t` 
LEFT OUTER JOIN `type` `type_type` ON (`t`.`user_id`=`type_type`.`user_id`) 
LEFT OUTER JOIN `type` `type` ON (`type`.`type_id`=`type_type`.`type_id`) 
WHERE ((type.type_ids NOT IN (3));

上面的查询仍然会返回user_id 1,因为该用户被分配了多种类型,我如何消除类型 3 的用户,无论他们被分配了多少其他类型?

4

2 回答 2

7

试试这个为你的where条款:

where t.user_id not in (select user_id from usertypes where type_id = 3)

在 MySQL 中,以下可能更有效:

where not exists (select 1 from usertypes ut where ut.type_id = 3 and ut.user_id = t.user_id)

顺便说一句,“t”是一个糟糕的别名users,尤其是当您使用另一个名为types. “u”将是一个更好的别名。

于 2013-02-12T01:51:03.043 回答
5

您的IN()子查询需要返回user_id具有type_id = 3.

SELECT
  COUNT(DISTINCT `t`.`user_id`)
FROM 
 `user` `t` 
WHERE `user_id NOT IN (SELECT `user_id` FROM `type_type` WHERE `type_id` = 3)

也可以使用LEFT JOIN针对同一个子查询的 a 来完成,在表中查找NULLs 。type_type

SELECT
  COUNT(DISTINCT `t`.`user_id`)
FROM 
 `user` `t` 
 LEFT JOIN (
   SELECT `user_id` FROM `type_type` WHERE `type_id` = 3
 ) user3 ON t.user_id = user3.user_id
WHERE user3.type_id IS NULL

http://sqlfiddle.com/#!2/b36b1/7

实际上,连接子查询甚至不是必需的。它适用于普通的LEFT JOIN.

SELECT
  COUNT(DISTINCT `t`.`user_id`)
FROM 
 `user` `t` 
 LEFT JOIN type_type ON t.user_id = type_type.user_id AND type_type.type_id = 3
WHERE type_type.type_id IS NULL

http://sqlfiddle.com/#!2/b36b1/10

于 2013-02-12T01:50:15.863 回答