2012-04-23 5 views
1

Я пытаюсь уйти в одну и ту же таблицу дважды, но это дает мне некоторые проблемы. У меня есть две таблицы ee_all и ee_calendar_events, к которой я хочу присоединиться.mysql левый соединяя ту же таблицу дважды

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, который это делает, если я достаю второй присоединиться. Но как только я добавляю его, запрос берется навсегда, а vacation_hours_earned имеет значение 2000 или что-то (что не так). Я предполагаю, что это суммирование строки снова, когда я добавляю второе соединение, но я этого не хочу. Я пробовал в течение нескольких часов, но не могу найти способ обойти его, буду признателен за любую помощь.

+0

Просьба предоставить образцы данных и желаемый результат. – RedFilter

+0

Зачем вам второе вступление? –

+0

@JerminBazazian Мне нужно второе соединение, потому что строки мне нужно сопоставить столбцу добавления для второго соединения. –

ответ

3

Когда самая правая таблица (второе соединение) имеет более одной строки, соответствующей строке выражения таблицы слева, строки выражения левой таблицы дублируются и подсчитываются более одного раза в 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

К сожалению, я уже принял первый ответ, но это очень здорово, не знал об этом синтаксисе. Благодаря :) –

Смежные вопросы