2

現在ユーザーに割り当てられていないジョブを選択しようとしています。

Users table: id | name
Jobs:        id | name
Assigned:    id | user_id | job_id | date_assigned

現在取られていない仕事をすべて選びたい。例:

ユーザー:

id   |   name
--------------
1    |   Chris
2    |   Steve

ジョブズ

id   |  name
---------------
1    |  Sweep
2    |  Skids
3    |  Mop

割り当てられた

id   |   user_id  |   job_id    |   date_assigned 
-------------------------------------------------
1    |   1        |   1         |   2012-01-01
2    |   1        |   2         |   2012-01-02
3    |   2        |   3         |   2012-01-05

2人に同じ仕事を割り当てることはできません。したがって、クエリは

[1, Sweep]

クリスが1日後にスキッドに引っ越して以来、誰もそれに取り組んでいないので。

ここのところ:

SELECT
    *
FROM
    jobs
WHERE
    id
NOT IN
    (
        SELECT
            DISTINCT(job_id)
        FROM
            assigned
        ORDER BY
            date_assigned
        DESC
    )

ただし、このクエリは同じデータセットに対してNULLを返します。現在作業中ではないため、スイープジョブが現在開いていることに対処していません。

4

4 に答える 4

2
SELECT a.*
FROM jobs a
LEFT JOIN
(
    SELECT a.job_id
    FROM assigned a
    INNER JOIN
    (
        SELECT MAX(id) AS maxid
        FROM assigned
        GROUP BY user_id
    ) b ON a.id = b.maxid
) b ON a.id = b.job_id
WHERE b.job_id IS NULL

これにより、ユーザーごとに最新のジョブが取得されます。それらのジョブのリストを取得したら、そのリストにないすべてのジョブを選択します。

于 2012-07-24T18:51:07.703 に答える
1

このバリアントを試すことができます:

select * from jobs
 where id not in (
  select job_id from (
    select user_id, job_id, max(date_assigned)
      from assigned
  group by user_id, job_id));
于 2012-07-24T18:52:13.900 に答える
0

私はあなたが望むかもしれないと思います:

SELECT *
FROM jobs
WHERE id NOT IN (SELECT job_id
                 from assigned
                 where user_id is not null
                )

これは、誰かを再割り当てすると、元の割り当てのユーザーIDが変更されることを前提としています。これは起こりますか?ちなみに、サブクエリも簡略化しました。

于 2012-07-24T18:52:37.097 に答える
0

まず、現在の仕事の割り当てのみのリストを確認する必要があります。注文だけでは不十分です。設定方法では、最新の割り当てである、Assignedからのジョブ割り当ての個別のサブセットが必要です。

したがって、次のようなグループ化サブクエリが必要です。

select job_id, user_id, max(date_assigned) last_assigned from assigned group by job_id, user_id

それをすべてまとめると、

select id, name from jobs
where id not in (
  select job_id as id from (
    select job_id, user_id, max(date_assigned) last_assigned from assigned 
    group by job_id, user_id
  )
)

追加機能として、「last_assigned」の値を渡すことができます。これにより、ジョブがアイドル状態になっている期間がわかります。

于 2012-07-24T19:03:51.380 に答える