我有这张桌子:
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, title, content, date
FROM updates
WHERE project_id = 2
ORDER BY date DESC
LIMIT 2
现在,我想在结果中动态添加'update_time'列,其值为“LATEST”或“PREVIOUS”,具体取决于它是最新更新还是之前的更新, 像这样:
update_time | update_id | content | date
------------------------------------------------------
LATEST | 5 | text... | 2011-12-23 22:10:30
PREVIOUS | 4 | text... | 2011-12-22 22:10:30
只有当您想知道我为什么需要这个时:MySQL: Select row by id with previous and next rows by date
答案 0 :(得分:6)
这是一些智能屁股SQL。它为第一行选择'LATEST',为所有其他选择'PREVIOUS'(我们应该有多于一个)。
SELECT IF(@rownum = 0, 'LATEST', 'PREVIOUS') update_time, update_id,
title, content, date, (@rownum := @rownum + 1) r
FROM updates, (SELECT @rownum := 0) dummy
WHERE project_id = 2
ORDER BY date DESC
LIMIT 2
此外,它还为结果集添加了另一列。希望这不是问题。
答案 1 :(得分:1)
那么@Sergei是完全正确的,但如果你坚持,有很多方法可以做到这一点。这是一个快速的
在表格中声明两个与Date
相同类型的变量,获取相关的rcords,然后将它们合并。可能有一些非常聪明的SQL用另一种方式来做。
注意我的mysql生锈了,所以你可能不得不知道这些东西。
Declare @Latest Date?
Declare @Previous Date?
Select @Latest = Select Max(`Date`) Where Product_ID = 2
Select @Previous = Select Max(`Date`) Where Product_ID = 2 and `Date` < @Latest
SELECT 'Latest' as Update_time,update_id, title, content, date
FROM updates
WHERE project_id = 2 and `Date` = @Latest
Union
SELECT 'Previous' update_id, title, content, date
FROM updates
WHERE project_id = 2 and `Date` = @Previous
凌乱的东西,你可以在几秒钟内做客户端......
答案 2 :(得分:1)
SELECT 'LATEST' AS update_time
, update_id, title, content, `date`
FROM updates
WHERE project_id = 2
ORDER BY `date` DESC
LIMIT 1 OFFSET 0
UNION
SELECT 'PREVIOUS'
, update_id, title, content, `date`
FROM updates
WHERE project_id = 2
ORDER BY `date` DESC
LIMIT 1 OFFSET 1
对列或表名使用DATE
之类的保留字是不好的。 MySQL允许你使用它,但其他DBMS可能不会(或MySQL具有不同的设置)。