2012-04-23 7 views
1

同じテーブルに2度も参加しようとしていますが、いくつか問題があります。私は参加したいテーブルee_allee_calendar_eventsを持っています。mysqlが同じテーブルを2回続けて残しました

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列が私は2番目を取る参加する場合はそれがない133を返すことになっています。しかしすぐに私がそれを追加すると、クエリは永遠になり、vacation_hours_earnedの値は2000か何か(間違っています)です。私の推測では、2回目の参加を追加すると行が再び集計されますが、私はそれを心配しません。私は数時間試してきましたが、その周りに道を見つけることができない、どんな助けにも感謝します。

+0

サンプルデータと出力をご提供ください。 – RedFilter

+0

なぜ2回目の参加が必要ですか? –

+0

@JerminBazazian 2番目の結合のために追加の列と一致する必要がある行があるため、2番目の結合が必要です。 –

答えて

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 
+0

私は、これは素晴らしい仕事を参照してください。ありがとう! –

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 
3

いくつかのMySQLの構文を使用して、あなただけの参加左から二番目を排除し、クエリを簡素化することができます。

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 

デモhere

+0

残念ながら私はすでに最初の答えを受け入れましたが、これはかなり素晴らしいですが、この構文を認識していませんでした。ありがとう:) –

関連する問題