阻止MySQL连接影响结果集

时间:2014-10-15 11:01:42

标签: mysql sql innodb

我有一个连接的问题,我想这将很容易修复(我想我有一个脑屁)。

这是我当前的工作查询:

SELECT ADDTIME(journey.departure, notrelatedtoquestion) AS departure
FROM journey
GROUP BY journey.id
ORDER BY departure

这是我想要工作但无法开始工作的查询:

SELECT ADDTIME(journey.departure, notrelatedtoquestion) AS departure
FROM journey
JOIN journey_non_operation ON journey_non_operation.journey = journey.code
WHERE NOW() NOT BETWEEN journey_non_operation.date_start AND journey_non_operation.date_end
GROUP BY journey.id
ORDER BY departure

嗯,它正在运行,但问题是由于新加入的journey_non_operation表的内容,它会更改结果集。

我想要实现的目标非常简单。我只是想在journey_non_operation表中过滤掉今天的旅程。但是,因为每次旅行都有许多非操作日期,所以它正在改变结果集。

以下是第一次和第二次查询的结果:

enter image description here ----- enter image description here

如何阻止journey_non_operation联接影响结果集,但是为了让我不选择他们的id在非操作日期之间的旅程?

journey_non_operation的表结构:

id - journey_id - start_date - end_date

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用not in运算符代替join

SELECT   ADDTIME(journey.departure, notrelatedtoquestion) AS departure
FROM     journey
WHERE    journey.code NOT IN (SELECT journey
                              FROM   journey_non_operation
                              WHERE  NOW() NOT BETWEEN date_start AND 
                                                       date_end)
GROUP BY journey.id
ORDER BY departure

答案 1 :(得分:0)

如果你使用LEFT JOIN并将BETWEEN子句作为ON的一部分,那么每次匹配都意味着不应该显示旅程。因此,您只需在LEFT JOIN之后显示没有匹配记录的行。

SELECT journey.id, ADDTIME(journey.departure, notrelatedtoquestion) AS departure
FROM journey
LEFT JOIN journey_non_operation ON journey_non_operation.journey = journey.code 
     AND  NOW()  BETWEEN journey_non_operation.date_start AND journey_non_operation.date_end
WHERE journey_non_operation.id is null
GROUP BY journey.id
ORDER BY departure