2014-10-30 16 views
0

我試圖編寫一個mysql查詢,該查詢返回單行中給定行的字段,以及匹配行中的幾個字段「之前」的位置,以及「下一個」位置的相同字段。我在MySQL的很新,但對於所有的淘淨的答案,這是最好的,我可以這樣做:mysql在同一個表中返回前一個和下一個子查詢中的多個列

SELECT *, 
(select id 
    from mytable t2 
    where t2.added_on < t.added_on 
    order by t2.added_on DESC 
    limit 1 
    ) as prev_id, 
(select id 
    from mytable t3 
    where t3.added_on > t.added_on 
    order by t3.added_on 
    limit 1 
    ) as next_id FROM mytable as t ORDER BY `added_on` 

它的工作原理,但只給了我id場「上一頁」和「下一個」。如您所知,在子查詢中使用*(或'id', 'title')而不是id會給出錯誤。我研究過使用JOIN和其他一些方法,但我只是沒有得到它。

+0

爲什麼你不只是3行?我的意思是3個查詢...或者像這樣使用'UNION':http://stackoverflow.com/a/20849223/2737474 – 2014-10-30 21:00:49

+0

@CharlesRojas,這對我的情況如何?我嘗試了顯而易見的方法,但那並不奏效。 – insaner 2014-10-30 21:27:24

+0

我檢查了文檔,不'UNION'返回結果作爲不同的行?而不是在同一行?如果可能的話,我希望我的結果在同一行。 – insaner 2014-10-30 21:38:12

回答

0

好吧,我想通了,這裏是你們所有人試圖找到解決方案的解決方案。確保投票,如果它幫助你。

SELECT t.*, 
    prev.id as prev_id, 
    prev.added_on as prev_added_on, 
    next.id as next_id, 
    next.added_on as next_added_on 
FROM `TABLE_NAME` AS t 
LEFT JOIN `TABLE_NAME` AS prev 
ON prev.id = 
    (select id 
    from `TABLE_NAME` t2 
    where t2.added_on < t.added_on 
    order by t2.added_on DESC 
    limit 1) 
LEFT JOIN `TABLE_NAME` AS next 
ON next.id = 
    (select id 
    from `TABLE_NAME` t3 
    where t3.added_on > t.added_on 
    order by t3.added_on 
    limit 1) 
ORDER BY t.added_on DESC 

這最後ORDER BY實際上導致了整個事情出於某種原因被大大優化(我目前的MySQL的理解並不讓我知道爲什麼這是肯定的),並在我的情況下,它使執行至少兩次沒有它一樣快。

相關問題