mysql在同一个表中返回前一个和下一个子查询中的多个列

问题描述:

我试图编写一个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://*.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

好吧,我想通了,这里是你们所有人试图找到解决方案的解决方案。确保投票,如果它帮助你。

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的理解并不让我知道为什么这是肯定的),并在我的情况下,它使执行至少两次没有它一样快。