0

簡単にするために、2 つのテーブルがあるとします...

users:
  user_id
  name
  age

clothing:
  user_id
  type
  color

21 歳で、シャツをまったく持っていないか、シャツを持っているが赤いシャツを持っていないすべてのユーザーを選択するにはどうすればよいでしょうか? これまでの私の試みは次のように見えました...

SELECT users.user_id
FROM users LEFT JOIN clothing
ON users.user_id = clothing.user_id
AND clothing.type = shirt
AND clothing.color != red
WHERE users.age = 21;

clothingユーザーがテーブルにエントリを持っていないエントリを選択したいだけの場合( WHERE clothing.user_id IS NULL)、このクエリを実行する方法は知っていますが、そのロジックをこの少し複雑なケースに拡張することはできないようです。

4

2 に答える 2

2
SELECT users.user_id FROM users
WHERE users.age = 21
AND users.user_id NOT IN
    (SELECT user_id FROM clothing WHERE user_id IS NOT NULL AND type = 'shirt' AND color = 'red')

実際には、赤いシャツを着ているすべての人を特定してから、「そのグループに含まれていないすべての人を教えてください」と言う方が簡単です。そうは言っても、実際には 2 つのテーブルに分割する必要があると思いますclothing。1 つは衣料品をリストするだけのテーブルで、もう 1 つは にリンクuser_idするテーブルですclothing_id

于 2013-11-01T20:34:25.510 に答える
0

次のようなものはどうですか:

SELECT users.user_id
FROM users u1 LEFT OUTER JOIN clothing c  # outer join makes sure you get a user back.
ON users.user_id = c.user_id
where c.type = shirt AND
(count(select * from users u2 where u1.user_id =- u2.user_id LEFT INNER JOIN clothing c2 on u2.user_id = c2.user_id) > 0 OR 
c.color != red) AND
users.age = 21;
于 2013-11-01T20:31:08.650 に答える