MySQL:按id选择行,按日期选择上一行和下一行
我有这张桌子:MySQL:按id选择行,按日期选择上一行和下一行,mysql,Mysql,我有这张桌子: 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... |
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
但除了所选行之外,我还希望根据特定项目id的日期列获取上一行和下一行,这样我就可以显示“上一次更新”和“下一次更新”链接(如果可用)。您需要两个子选择。。但现在我们要把它们联系起来
SELECT @rownum:=@rownum+1 as place, update_id, project_id, content, date, () as previous, () as next, (SELECT @rownum:=0)
<空白>由相同形式的子查询替换。 您需要2个子选择。但现在我们要把它们联系起来
SELECT @rownum:=@rownum+1 as place, update_id, project_id, content, date, () as previous, () as next, (SELECT @rownum:=0)
以相同形式的子查询替换空白。
第一种方法。这将选择返回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
第一种方法。这将选择返回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
表是否有主键?这会更容易。恐怕你需要两个问题。@Eugen:update\u id是主键,我更新了问题。@Sergei:真的吗?我见过使用一个查询完成更复杂的事情。表有主键吗?这会更容易。恐怕你需要两个问题。@Eugen:update\u id是主键,我更新了问题。@Sergei:真的吗?我已经看到使用一个查询可以完成更复杂的事情。如果您向每个WHERE添加并投影_id=2,并将每个were更改为WHERE,则每个OP的问题会更正确。我得到:第行“update were update_id=2 ORDER BY date DESC LIMIT 1 TP UNION SEL”附近的语法错误28@Jonathan,刷新屏幕。正如阿玛丹指着我说的那样,我已经用where改变了were。还要记住,“更新”是一个保留字。@乔纳森,对以前的错误表示抱歉。@danihp:有没有办法不重复“更新id=2”和“项目id=2”那么多次?使用CodeIgniter数据库Classis多次传递这些参数可能是一个问题。如果您向每个WHERE添加并投影_id=2,并将每个WHERE更改为WHERE,则每个OP的问题都会变得更正确。Im获取:第行“update were update_id=2 ORDER BY date DESC LIMIT 1 TP UNION SEL”附近的语法错误28@Jonathan,刷新屏幕。正如阿玛丹指着我说的那样,我已经用where改变了were。还要记住,“更新”是一个保留字。@乔纳森,对以前的错误表示抱歉。@danihp:有没有办法不重复“更新id=2”和“项目id=2”那么多次?使用CodeIgniter数据库多次传递这些参数可能是个问题Classblank被相同形式的子查询所取代??我不明白。使用rownum技巧,您可以为顶级查询引用上一个和下一个日期。空白被相同表单的子查询替换??我不明白。使用rownum技巧,您可以为顶级查询引用上一个和下一个日期。