Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:按id选择行,按日期选择上一行和下一行_Mysql - Fatal编程技术网

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技巧,您可以为顶级查询引用上一个和下一个日期。