1

同じテーブルに 2 回参加しようとしていますが、問題が発生しています。2 つのテーブルがee_allありee_calendar_events、参加したいと考えています。

SELECT
    u.first_name,
    u.last_name,
    u.email,
    SUM(e1.total_vacation_hours_earned) AS vacation_hours_earned,
    SUM(e2.absent_hours)
FROM ee_all AS u 
LEFT JOIN ee_calendar_events AS e1 ON u.user_id = e1.sched_user_id
LEFT JOIN ee_calendar_events AS e2 ON u.user_id = e2.sched_user_id AND e2.event_id = 2
WHERE
    u.user_id = 23

vacation_hours_earned列は 133 を返すはずですが、2 番目の結合を実行すると返されます。しかし、追加するとすぐに、クエリに時間がかかりvacation_hours_earned、値が 2000 か何かになります (これは間違っています)。私の推測では、2 番目の結合を追加すると行が再び合計されますが、それは望ましくありません。数時間試してみましたが、それを回避する方法が見つかりません。助けていただければ幸いです。

4

3 に答える 3

3

右端のテーブル (2 番目の結合) に、左側のテーブル式の行に対応する複数の行がある場合、左側のテーブル式の行が重複し、SUM で複数回カウントされます。代わりにサブクエリを使用してください。

SELECT
    u.first_name,
    u.last_name,
    u.email,
    (
        SELECT
            SUM(e1.total_vacation_hours_earned)
        FROM
            ee_calendar_events AS e1
        WHERE
            u.user_id = e1.sched_user_id
    ) AS vacation_hours_earned,
    (similar) AS absent_hours
FROM
    ee_all AS u
WHERE
    u.user_id = 23
于 2012-04-23T15:29:16.033 に答える
3

一部の MySQL 構文を使用すると、2 番目の左結合を削除して、クエリを単純化できます。

SELECT
    u.first_name,
    u.last_name,
    u.email,
    SUM(e1.total_vacation_hours_earned) AS vacation_hours_earned,
    SUM(e1.absent_hours * (event_id=2))
FROM ee_all AS u 
LEFT JOIN ee_calendar_events AS e1 ON u.user_id = e1.sched_user_id
WHERE
    u.user_id = 23

ここでデモ。

于 2012-04-23T15:32:08.440 に答える
0
SELECT
    u.first_name,
    u.last_name,
    u.email,
    SUM(e1.total_vacation_hours_earned) AS vacation_hours_earned,    
   (select SUM(e2.absent_hours) as absenthours from ee_calendar_events AS e2 where u.user_id = e2.sched_user_id AND e2.event_id = 2)    
    FROM ee_all AS u 
    LEFT JOIN ee_calendar_events AS e1 ON u.user_id = e1.sched_user_id
    WHERE
    u.user_id = 23
于 2012-04-23T15:31:51.563 に答える