2016-01-26 33 views
0

我一直在MySQL 5.5(Percona的)運行的網站,並使用此查詢,它的工作原理:問題使用子查詢的MySQL 5.5 VS 5.6

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

您是否嘗試過使用'BusDestinationStations.Dayofset'它是否正在工作? –

+0

它工作在一個不同的查詢,但在這個查詢中使用它會意味着另一個表的實例,這不是我想要完成的。即便如此,它不與「BusDestinationStations」工作 - 它說未知列「BusDestinationStations.DayOfset」在「where子句」 – DreamWave

+0

一旦我粘貼在MySQL它給了我一個SQL語法錯誤 '選擇 bds.FromStationPositionID FROM BusDestinationSegments AS bds LEFT JOIN BusDestinationSegmentPrices AS bdsp ON bds.SegmentID = bdsp。BusDestinationSegmentID 與EXISTS(SELECT BusDestinationScheduleID FROM BusDestinationSchedule WHERE BusDestinationScheduleDate + INTERVAL bdssf.DayOfset DAY = '2016年1月26日' )(BusDestinationStations AS bdssf)' –

回答

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當次查詢執行。

認爲以下將是你正在嘗試做相同的: -

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' 
) 

(雖然我有點半信半疑做交叉聯接一樣,只是爲了獲得值的子查詢 - 看起來非常低效)。

+0

在5.5版本的文檔中也出現了相同的聲明 - 但是混合舊式和新式連接並且我同意你對正在發生的事情的理論是不好的做法 – PaulF

+0

謝謝,它的工作非常好。優秀的解釋! – DreamWave