0

4 つのサブクエリで構成されるクエリがあります。クエリは次のとおりです。

SELECT
  (SELECT
     COUNT(id)
   FROM timelog
   WHERE emp_id = 1
       AND am_in > GET_TIME_IN1(emp_id, DATE)) AS tardy1,
  (SELECT
     COUNT(id)
   FROM timelog
   WHERE emp_id = 1
       AND pm_in > GET_TIME_IN2(emp_id, DATE)) AS tardy2,
   (SELECT balance FROM leave_credit lc JOIN leave_type lt ON lc.leave_type_id = lt.id WHERE emp_id = 1 AND lt.active = TRUE) AS balance,
   (SELECT leave_type_id FROM leave_credit lc JOIN leave_type lt ON lc.leave_type_id = lt.id WHERE emp_id = 1 AND lt.active = TRUE) AS leave_type_id

そのようにして、PHP から SQL サーバーへのクエリ文字列を 1 つだけにして、すべての結果をインスタンスで取得できるようにしました。サブクエリがパフォーマンスに影響を与える可能性があることは知っていますが、私の状況では、問題に対処するためのより良い方法はありますか?

サンプル データ: タイムログ テーブル タイムログテーブル

クレジットテーブルを離れる

クレジットを残す

4

1 に答える 1

1

代替バージョンは次のとおりです。

SELECT tardy1, tardy2, balance, leave_type_id
FROM (SELECT emp_id, SUM(case when GET_TIME_IN1(emp_id, DATE) then 1 else 0 end) as tardy1,
             SUM(case when pm_in > GET_TIME_IN2(emp_id, DATE) then 1 else 0 end) as tardy2
      FROM timelog
      WHERE emp_id = 1 
      group by emp_id
     ) tardy join
    (SELECT emp_id, balance, leave_type_id
     FROM leave_credit lc full outer JOIN
          leave_type lt
          ON lc.leave_type_id = lt.id
     WHERE emp_id = 1 AND lt.active = TRUE
    ) balance
    on tardy.emp_id = balance.emp_id
where tardy.emp_id = 1 

すべての従業員の場合:

SELECT tardy1, tardy2, balance, leave_type_id
FROM (SELECT emp_id, SUM(case when GET_TIME_IN1(emp_id, DATE) then 1 else 0 end) as tardy1,
             SUM(case when pm_in > GET_TIME_IN2(emp_id, DATE) then 1 else 0 end) as tardy2
      FROM timelog
      group by emp_id
     ) tardy full outer join
    (SELECT emp_id, balance, leave_type_id
     FROM leave_credit lc JOIN
          leave_type lt
          ON lc.leave_type_id = lt.id
     WHERE lt.active = TRUE
    ) balance
    on tardy.emp_id = balance.emp_id

これらのサブクエリを組み合わせようとする場合は、に複数の行がtimelogあり、従業員が1つのテーブルにあり、他のテーブルにはない可能性があるため、注意する必要があります。

于 2013-01-04T14:47:40.173 に答える