复杂SQL查询 - 连接表中的字段总和

时间:2014-03-28 09:28:29

标签: mysql sql

SQL小提琴:http://sqlfiddle.com/#!2/b46ea/2

当前SQL:

SELECT `vehicle_journey`.*,
    ADDTIME(departure, SEC_TO_TIME((1))) AS stopDepartureTime
FROM `vehicle_journey`
INNER JOIN `vehicle_journey_days`
    ON `vehicle_journey_days`.`journey_reference` = `vehicle_journey`.`reference`
INNER JOIN `journey_pattern`
    ON `journey_pattern`.`reference` = `vehicle_journey`.`journey_pattern_reference`
INNER JOIN `journey_pattern_timing_link`
    ON `journey_pattern_timing_link`.`section` = `journey_pattern`.`journey_pattern_section`
WHERE `journey_pattern_timing_link`.`stop` = '1900HA030193'
    AND `vehicle_journey_days`.`day` = 'MondayToFriday'

此SQL语句的最终目的是根据departure中的vehicle_journey时间和run_time中的journey_pattern_timing_link来获取总线的到达时间。

这是证明困难的原因以及我寻求帮助的原因是因为journey_pattern_timing_link表的性质。该表设置为提供从一个停靠点到下一个停靠点所需的时间(这是因为时间相对于每个出发时间)。

正如您将在select语句中看到的那样,我离它不远。 ' ADDTIME'功能是计算公交车站出发时间的地方。但是,你会看到一个' 1'在值中添加到出发时间。这只是一个占位符,基本上它在SEC_TO_TIME函数中,我需要加起来并计算出发时间。

但是等等,我们加起来了什么?这就是我对journey_pattern_timing_link表的本质的意思。我需要做的是获取journey_pattern_timing_link表中所有run_time字段的总和,其中ID少于where语句和journey_pattern_timing_link中所选停靠点之一。{{1} }等于基于连接的那个。

我知道这是一个非常长的问题,需要经过深思熟虑,但我很好并且真正陷入困境。查看SQL Fiddle的模式浏览器应该有助于理解表结构。

2 个答案:

答案 0 :(得分:3)

试试这个,虽然SQL小提琴似乎很难解决: -

SELECT vehicle_journey.id, 
        vehicle_journey.journey_pattern_reference, 
        vehicle_journey.departure, 
        vehicle_journey.service_reference, 
        vehicle_journey.reference, 
        vehicle_journey.code, 
        vehicle_journey_days.day,
        TIME(ADDTIME(departure, SEC_TO_TIME(SUM(jptl2.run_time)))) AS stopDepartureTime
FROM vehicle_journey
INNER JOIN vehicle_journey_days ON vehicle_journey_days.journey_reference = vehicle_journey.reference
INNER JOIN journey_pattern ON journey_pattern.reference = vehicle_journey.journey_pattern_reference
INNER JOIN journey_pattern_timing_link ON journey_pattern_timing_link.section = journey_pattern.journey_pattern_section AND journey_pattern_timing_link.stop = '1900HA080102' 
INNER JOIN journey_pattern_timing_link  jptl2 ON jptl2.section = journey_pattern.journey_pattern_section AND jptl2.ID <= journey_pattern_timing_link.ID
WHERE vehicle_journey_days.day = 'Saturday'
GROUP BY vehicle_journey.id, vehicle_journey.journey_pattern_reference, vehicle_journey.departure, vehicle_journey.service_reference, vehicle_journey.reference, vehicle_journey.code

答案 1 :(得分:2)

我认为这样做了。它会在journey_pattern_timing_link上进行第二次加入以获取所有停靠点,包括您要查找的停靠点,然后汇总其run_time并将其添加到departure

SELECT 
  `vehicle_journey`.*,
  ADDTIME(departure,SEC_TO_TIME(SUM(`previous_stops`.`run_time`))) `duration`  
FROM `vehicle_journey`
INNER JOIN `vehicle_journey_days`
    ON `vehicle_journey_days`.`journey_reference` = `vehicle_journey`.`reference`
INNER JOIN `journey_pattern`
    ON `journey_pattern`.`reference` = `vehicle_journey`.`journey_pattern_reference`
INNER JOIN `journey_pattern_timing_link`
    ON `journey_pattern_timing_link`.`section` = `journey_pattern`.`journey_pattern_section`
LEFT JOIN `journey_pattern_timing_link` `previous_stops`
    ON `journey_pattern_timing_link`.`section` = `previous_stops`.`section`
    AND `journey_pattern_timing_link`.`id` >= `previous_stops`.`id`
WHERE `journey_pattern_timing_link`.`stop` = '1900HA080987'
    AND `vehicle_journey_days`.`day` = 'Saturday'
GROUP BY
  `vehicle_journey`.`id`,
  `vehicle_journey`.`journey_pattern_reference`,
  `vehicle_journey`.`departure`,
  `vehicle_journey`.`service_reference`,
  `vehicle_journey`.`reference`,
  `vehicle_journey`.`code`