1

我试图离开加入同一张桌子两次,但这给我带来了一些问题。我有两张桌子ee_allee_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,如果我取出第二个连接,它会返回 133。但是一旦我添加它,查询就会永远持续下去,并且vacation_hours_earned它的值为 2000 或其他值(这是错误的)。我的猜测是,当我添加第二个连接时,它会再次对行求和,但我不希望那样。我已经尝试了几个小时,但找不到解决方法,不胜感激。

4

3 回答 3

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
于 2012-04-23T15:29:16.033 回答
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

演示在这里

于 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 回答