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

MySQL:向查询结果动态添加列,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, 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 

除非你想知道我为什么需要这个:

嗯@Sergei是非常正确的,但是如果你坚持,有很多方法可以做到这一点。这里有一个快速的

在表中声明两个与Date类型相同的变量,获取相应的RCORD,然后将它们合并。可能有一些非常聪明的sql以另一种方式来实现

NB我的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
你可以在客户端在几秒钟内完成的事情很混乱

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。

这里有一些聪明的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

它还向结果集添加了另一列。希望这不是问题。

似乎是最容易在客户端完成的工作。@Sergei:你也对我之前的问题发表了评论,你也说过这是不可能的,但事实确实如此。请停止发布这种评论,我不知道客户端javascript是什么意思??无论如何,我的问题是如何在MySQL中实现它,而不是如何实现它。本例中的客户端是PHP或类似的。这不是同一个问题。。。但请随意发布您的答案。@SergioTulentsev对您为什么提到客户端和PHP感到困惑,因为PHP是一种服务器端语言,而不是客户端语言。无论如何,这个问题都与通过MySQL进行查询有关。这个查询比@ypercube提出的查询快10倍,谢谢!如果你有时间,请看一下我前面的问题,也许你也可以改进那里的查询,我会接受你的回答。你能给我一个示例数据转储,这样我就可以使用真实的数据了吗@Jonathan:这个查询和我的版本都需要一个项目id、日期复合索引。@ypercube:这个查询正在运行,这意味着我已经有了一个项目id、日期复合索引??该索引将提高这个查询的性能。我们不知道你是否有索引。