2012-04-23 40 views
1

我正在尝试两次连接同一个表,但它给了我一些问题。我有两个表ee_allee_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 2012-04-23 15:22:04

+0

为什么你需要第二次连接呢? – 2012-04-23 15:34:04

+0

@JerminBazazian我需要第二次连接,因为我需要匹配第二次连接的添加列。 – 2012-04-23 15:37:32

回答

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

我明白了,这个效果很好。谢谢! – 2012-04-23 15:38:01

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

不幸的是,我已经接受了第一个答案,但这非常棒,没有意识到这个语法。谢谢 :) – 2012-04-23 15:40:29