0

この質問は、 MySQL を使用して 2 つのカンマ区切りの文字列リストを比較する方法の拡張です。

TASKS_DONE2つの列user_idtask_id(INT)を持つテーブルがあります。これらのコードは、ユーザーが実行するタスクを表すために使用されます。

個別のテーブルは、タスクとユーザーの詳細を維持するために使用されますTASKSUSERS

私の要件は、ユーザーが一連のタスクを実行したかどうかを確認することです (たとえば2, 3, 5)。現在、次のクエリがあります。

select * from USERS u
where
  (
    select SUM( IF(task_id in (2, 3, 5), 1, 0) )
    from TASKS_DONE td
    where td.user_id=u.user_id
    group by td.user_id
  ) = 3

カウント (3この場合) はクエリに動的に供給されます。このアプローチの問題は、ユーザーが同じタスクを 2 回実行した場合、タスクの両方のインスタンスがカウントに含まれることです。しかし、私はの別個のセットだけを考慮する必要がありますtask_id

助けてください。

4

2 に答える 2

2

それらのための場所があると思いますが、相関サブクエリはとても厄介なようです...

SELECT u.* 
  FROM users u
  JOIN tasks_done td
    ON td.user_id = u.user_id
   AND td.task_id IN (2,3,5)
 GROUP
    BY u.user_id
HAVING COUNT(DISTINCT td.task_id) = 3;
于 2013-01-17T10:09:06.763 に答える
1

これを試して:

SELECT user_id
FROM users
JOIN (
    SELECT task_id, user_id
    FROM tasks
    WHERE task_id IN (2, 3, 5)
    GROUP BY task_id, user_id
) AS unique_tasks USING (user_id)
GROUP BY user_id
HAVING COUNT(user_id) = 3

users次に、この結果セットを再度結合して、詳細情報を取得します。

SELECT users.*
FROM users
JOIN (
    SELECT user_id
    FROM users
    JOIN (
        SELECT task_id, user_id
        FROM tasks
        WHERE task_id IN (2, 3, 5)
        GROUP BY task_id, user_id
    ) AS unique_tasks USING (user_id)
    GROUP BY user_id
    HAVING COUNT(user_id) = 3
) AS selected_users USING (user_id)
于 2013-01-17T09:44:16.263 に答える