2011-12-29 65 views
1

我有这个表:的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'列,其值为“最新”或“上一次”,基于它是否是最新的更新或之前的版本, 是这样的:

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

看起来像一个最容易完成客户端的工作。 – 2011-12-29 23:32:08

+0

@Sergei:你也评论过我以前的问题,你也说过这是不可能的,但是它是。请停止发布这种评论,我不知道你的意思是客户端,JavaScript?无论如何,我的问题是如何在MySQL中做到这一点,而不是如何做到这一点。 – Jonathan 2011-12-29 23:37:03

+0

这种情况下的客户端是PHP或类似的。 – 2011-12-29 23:40:02

回答

6

这里有一些聪明的SQL SQL。它为第一行选择'最新',所有其他选择'先前'(如果我们有其中一个以上)。

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 

此外,它增加了另一列到结果集。希望这不是问题。

+0

这个查询是由@ypercube提出的一个更快10倍,谢谢!如果你有时间,请看看我以前的问题,也许你可以改善那里的查询,我会接受你的答案。 – Jonathan 2011-12-30 00:32:33

+0

你能否给我一个样本数据转储,以便我可以玩真实的数据? :) – 2011-12-30 00:37:46

+0

与此同时,你可以接受这一个:-) – 2011-12-30 00:40:25

1

好@Sergei是相当正确的,但如果你坚持,有很多方法可以做到这一点。这里有一个快速的例子

在表格中声明与Date相同类型的两个变量,得到相应的rcords然后合并它们。有可能是一些非常聪明的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 

凌乱的东西,你可以做在几秒钟内客户端...

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)。

+0

必须学习此限制和抵消的东西有时... – 2011-12-30 13:15:55

+0

工作,但性能下降.. – Jonathan 2011-12-30 16:59:35