1

ユーザーとタスク用に2つのテーブルがあるとします。可能な値が「完了」および「未完了」のステータスを持つタスクに user_id と status があります。ここで、タスクを 1 つも完了していないユーザーを取得したいと考えています。最も粗雑な方法は、少なくとも 1 つの完了したタスクを持っているユーザーを最初に見つけて、"not in" クエリを実行することです。

「in」サブクエリなしでこれを達成するためのより良い方法。データセットは巨大であり、タスクテーブルを長時間ロックする余裕がないことに注意してください!

4

3 に答える 3

1

task.user_idNULL を含めることができない場合(つまり、NOT NULL制約がある場合)、LEFT JOINwithIS NULL最適な選択です:

SELECT user.* FROM user
LEFT JOIN task ON (task.user_id = user.id AND task.status = 'complete')
WHERE task.user_id IS NULL
于 2013-09-15T06:03:38.003 に答える
0

以下のクエリを試してみると、1 つでも複数のタスクを完了したユーザーが一覧表示されます

SELECT u.*,
COUNT(  CASE WHEN  t.`status`= 'Completed' THEN t.`status` END  ) AS completed ,

COUNT(  CASE WHEN  t.`status`= 'Not completed' THEN t.`status` END  ) AS Not_completed

FROM `user`  u

LEFT JOIN `task` t  ON (u.id =t.user_id)

GROUP BY t.user_id HAVING completed >0

これにより、タスクを 1 つも完了していないユーザーが一覧表示されます

SELECT u.*,
COUNT(  CASE WHEN  t.`status`= 'Completed' THEN t.`status` END  ) AS completed ,

COUNT(  CASE WHEN  t.`status`= 'Not completed' THEN t.`status` END  ) AS Not_completed

FROM `user`  u

LEFT JOIN `task` t  ON (u.id =t.user_id)

GROUP BY t.user_id HAVING completed = 0

タスクを完了したユーザーのフィドルを参照してください

タスクを完了していないユーザーについては、フィドルを参照してください

于 2013-09-14T14:20:51.930 に答える