2

データベースに3つのテーブルがあります。

  1. employee_log

  2. job_log

  3. クルーログ

新しいジョブが作成されると、従業員がそれに割り当てられるため、「crew_log」テーブルにエントリが作成されます。

私がやろうとしているのは、type = 2属性(つまり、彼らがスーパーバイザーであることを意味する)を持つ各従業員を(employee_logから)フェッチしてから、crew_logをクエリに参加させることです。

各従業員は「crew_log」に複数のアクティブなジョブを持つことができるため、目標はその従業員のすべてのアクティブなジョブを配列で返すことです。

これまでの私のクエリは次のようになります。

SELECT el.id, cl.job_id
FROM employee_log AS el
JOIN crew_log AS cl
    ON el.id=cl.employee_id
    AND cl.start_date >= CURDATE()
WHERE el.type=2
GROUP BY cl.employee_id

もちろん正しくありませんが、私の問題を視覚化するのに役立つかもしれません。

もちろん、これは別の方法で行うこともできます...しかし、パフォーマンスとSQLについて新しいことを学ぶために、すべてを1つのSQLクエリで実行しようとしています。

別の方法は、2つのwhileループを使用することです。最初のループはtype=2の各従業員を取得し、次にそのループ内で別のSQLクエリを実行して、その従業員のすべてのアクティブなジョブをフェッチします。

それを行うためのより良い方法が必要ですか?

4

1 に答える 1

1

クエリはそのままで正しいように見えますがGROUP BY、集計関数がないため ( SUM(), COUNT(), AVG())は必要ありませんORDER BY。従業員 ID で並べ替えるには、 に置き換えます。

SELECT el.id, cl.job_id
FROM 
  employee_log AS el
  LEFT JOIN crew_log AS cl
    ON el.id=cl.employee_id
WHERE 
  el.type=2
  AND cl.start_date >= CURDATE()
ORDER BY el.id

また、レコードを持たない従業員がクエリから除外されないように、あなたJOINを aに置き換えました。LEFT JOINcrew_log

于 2012-04-13T00:44:38.230 に答える