2011-12-29 64 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