仅选择表包含两个特定值的项目

时间:2014-08-07 18:00:06

标签: mysql sql

SELECT DISTINCT(journey.id)
FROM journey
JOIN journey_day ON journey_day.journey = journey.id
JOIN pattern ON pattern.id = journey.pattern
JOIN pattern_link ON pattern_link.section = pattern.section
WHERE pattern.service = :service AND pattern.direction = :direction AND journey_day.day = :day

上面我有一个MySQL查询,应该根据一些变量提取一个旅程列表。

我现在要做的是添加另外两个可以调整查询的变量。我需要将我要说的内容转换为SQL格式,然后将其附加到我当前的查询中,但我不知道该怎么做。

我需要确保pattern_link表包含两个一个:departure:arrival值,实际上只是使它包含这两个变量的拉动旅程。

在这个例子中我们讨论的是公交车时刻表,所以理论上我只想选择穿越:departure:arrival公交站点的旅程。 pattern_link表基本上是一个将公共汽车站连接到旅程中的公共汽车站的表。此外,值得一提的是,我并不仅仅意味着这两站,我的意思是这两站就在桌子的某个地方。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

我不完全理解你是如何表达这个问题的。不过,我认为您正在寻找包含相应pattern_link s中的出发值和到达值的旅程。如果是,您可以使用group byhaving

执行此操作
SELECT j.id
FROM journey j JOIN
     journey_day jd
     ON jd.journey = j.id JOIN
     pattern p
     ON p.id = j.pattern JOIN
     pattern_link pl
     ON pl.section = pattern.section
WHERE p.service = :service AND p.direction = :direction AND jd.day = :day
GROUP BY j.id
HAVING sum(p.busstop = :arrival) > 0 and
       sum(p.busstop = :departure) > 0;

我不确定您想要的字段是在pattern表格还是pattern_link,但同样的想法会保留。

答案 1 :(得分:1)

添加附加条件的最简单方法是创建自联接,如下所示:

SELECT DISTINCT(journey.id)
FROM journey
JOIN journey_day ON journey_day.journey = journey.id
JOIN pattern ON pattern.id = journey.pattern
JOIN pattern_link pattern_link_dep ON pattern_link_dep.section = pattern.section AND pattern_link_dep.<time_column> = :departure
JOIN pattern_link pattern_link_arr ON pattern_link_arr.section = pattern.section AND pattern_link_arr.<time_column> = :arrival
WHERE pattern.service = :service AND pattern.direction = :direction AND journey_day.day = :day;

time_column替换为相应的列名。

答案 2 :(得分:0)

Just和一个where子句来限制模式,然后使用group by / having子句来获得2的计数。

AND (:departure = pattern_link.some_column OR :arrival = pattern_link.some_column)

这应该让你在jounrney得到两个记录。然后按travel.id分组并检查计数:

GROUP BY JOURNEY.ID
HAVING COUNT(*) > 1

如果这不起作用,或者如果桌子可以举行两次出发或到达,并且通过具有给定出发的两行并且例如没有到达而得到大于一的计数,请告诉我。