我一直在MySQL 5.5(percona)上运行一个网站并使用这个查询,它的工作原理如下:
SELECT
bds.FromStationPositionID
FROM
BusDestinationSegments AS bds
LEFT JOIN BusDestinationSegmentPrices AS bdsp ON bds.SegmentID = bdsp.BusDestinationSegmentID
AND EXISTS (
SELECT
BusDestinationScheduleID
FROM
BusDestinationSchedule
WHERE
BusDestinationScheduleDate + INTERVAL bdssf.DayOfset DAY = '2016-01-26'
),
BusDestinationStations AS bdssf
我需要升级到5.6(再次Percona)所以我刚刚(在开发服务器上)。 但是,此查询现在不起作用。它告诉我:
[Err] 1054 - Unknown column 'bdssf.DayOfset' in 'where clause'
我应该补充一点,我已经检查了,列就在那里。
我猜测从5.5到5.6有一些变化,它不允许我在子查询中使用列,但我找不到关于该主题的任何内容。
有没有人对此有任何经验,或者有人可以建议我想要完成的工作方式吗?
答案 0 :(得分:2)
您似乎使用了旧的和新的JOIN语法。并期望BusDestinationStations(来自DayOfset列的bdssf)到CROSS JOIN。
这曾经起作用,但MySQL 5.6中的一个变化是连接的优先级: -
http://dev.mysql.com/doc/refman/5.6/en/join.html: -
以前,逗号运算符(,)和JOIN都有相同的含义 优先级,因此连接表达式t1,t2 JOIN t3被解释为 ((t1,t2)JOIN t3)。现在JOIN具有更高的优先级,所以表达式 被解释为(t1,(t2 JOIN t3))。此更改会影响语句 使用ON子句,因为该子句只能引用列 在连接的操作数中,优先级的变化会发生变化 解释这些操作数是什么。
所以我认为正在发生的事情是MySQL正在尝试在隐式连接到BusDestinationStations之前执行子查询的处理,因此在执行子查询时它不知道有关bdssf.DayOfset的任何信息。 / p>
认为以下内容相当于您要做的事情: -
SELECT bds.FromStationPositionID
FROM BusDestinationSegments AS bds
CROSS JOIN BusDestinationStations AS bdssf
LEFT JOIN BusDestinationSegmentPrices AS bdsp ON bds.SegmentID = bdsp.BusDestinationSegmentID
AND EXISTS
(
SELECT BusDestinationScheduleID
FROM BusDestinationSchedule
WHERE BusDestinationScheduleDate + INTERVAL bdssf.DayOfset DAY = '2016-01-26'
)
(虽然我有点怀疑做交叉连接就像获取子查询的值一样 - 看起来非常低效)。