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

私が使用して特定のプロジェクトのために、最新の2回の更新を取得するには:今

SELECT update_id, title, content, date 
FROM updates 
WHERE project_id = 2 
ORDER BY date DESC 
LIMIT 2 

を、私は動的に追加します最新の更新であるかそれ以前のものかに基づいて "LATEST"または "PREVIOUS"の値を持つ "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

クライアント側で最も簡単に仕事をしているようです。 –

+0

@Sergei:以前の私の質問にもコメントしましたが、それは可能ではないとも言いましたが、そうでした。この種のコメントを投稿するのをやめてください。クライアント側、JavaScriptの意味は分かりますか?とにかく、私の質問は、MySQLでそれを行う方法ではなく、他の方法で行うことができます。 – Jonathan

+0

この場合のクライアントはPHPなどです。 –

答えて

6

ここにいくつかスマートなSQLがあります。最初の行には「LATEST」を選択し、他の行には「PREVIOUS」を選択します(2つ以上ある場合)。

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

+0

実際のデータを再生できるようにサンプルデータのダンプを取得できますか? :) –

+0

一方で、あなたはこの1つを受け入れることができます:-) –

1

よく@Sergeiはかなり正しいですが、あなたが主張するならば、これを行う方法はたくさんあります。ここには簡単なものがあります

Dateと同じタイプの2つの変数を宣言して、対応する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

この制限を学ばなければならないし、時々ものをオフセットする必要があります... –

+0

動作しますが、パフォーマンスは遅くなります。 – Jonathan