2011-12-29 36 views
1

我有这个表:MySQL的:选择行与前面和后面的行ID按日期

update_id | project_id | content | date 
------------------------------------------------------ 
1   | 1   | text... | 2011-12-20 22:10:30 
2   | 2   | text... | 2011-12-20 22:10:30 
3   | 2   | text... | 2011-12-21 22:10:30 
4   | 2   | text... | 2011-12-22 22:10:30 
5   | 2   | text... | 2011-12-23 22:10:30 

我当前的查询是:

SELECT update_id, project_id, content, date 
FROM update 
WHERE update_id = 2 
AND project_id = 2 
ORDER BY date DESC 
LIMIT 1 

但是,除了选定的行,我想也是基于日期列的前一行和下一行(对于特定的project_id),所以我可以显示'上一次更新'和'下一次更新'链接(如果可用)。

+1

表中是否有主键?这将使它更容易。 – 2011-12-29 21:20:41

+0

恐怕你需要两个查询。 – 2011-12-29 21:21:34

+0

@Eugen:update_id是主键,我更新了问题。 – Jonathan 2011-12-29 21:22:19

回答

0

你需要2个子选择..但现在要链接它们。

SELECT @rownum:[email protected]+1 as place, update_id, project_id, content, date,() as previous,() as next, (SELECT @rownum:=0) 

其中blank()被替换为相同形式的子查询。

+0

blank()被相同形式的子查询替换?我没有明白。 – Jonathan 2011-12-29 21:40:31

+0

与rownum技巧,因此您可以引用顶级查询的上一个日期和下一个日期。 – 2011-12-29 22:10:53

1

第一种方法。这选择返回3行。您选择的行和前一个日期的行以及下一个日期的阳极行:

SELECT * FROM ( 
SELECT 
    'THIS' as update_time, 
    update_id, 
    project_id, 
    content, 
    date 
FROM 
    `update` 
WHERE 
    update_id = 2 AND project_id = 2 
ORDER 
    BY date DESC 
LIMIT 1 
) TT 
UNION 
SELECT * FROM ( 
SELECT 
    'PREVIOUS' as update_time, 
    update_id, 
    project_id, 
    content, 
    date 
FROM 
    `update` 
WHERE 
    update_id <> 2 AND project_id = 2 and 
    date <= (select date from `update` where update_id = 2) 
ORDER 
    BY date DESC 
LIMIT 1 
) TP 
UNION 
SELECT * FROM ( 
SELECT 
    'NEXT' as update_time, 
    update_id, 
    project_id, 
    content, 
    date 
FROM 
    `update` 
WHERE 
    update_id <> 2 AND project_id = 2 and 
    date >= (select date from `update` where update_id = 2) 
ORDER 
    BY date ASC 
LIMIT 1 
) TN 
+0

我得到了:#1221 - 不正确的使用UNION和ORDER BY – Jonathan 2011-12-29 21:31:21

+1

如果您为每个WHERE添加AND project_id = 2,并且将每个都更改为WHERE,那么它会更加正确(每个OP的问题)。 – Amadan 2011-12-29 21:32:35

+0

@Jonathan,请试试吧。 – danihp 2011-12-29 21:36:18