MySQL:动态添加列以查询结果

时间:2011-12-29 23:27:10

标签: 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... | 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

3 个答案:

答案 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具有不同的设置)。

相关问题