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

サブクエリは、を含むsIN()を返す必要があります。user_idtype_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同じサブクエリに対してを使用して、テーブルで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 に答える