2011-08-08 50 views
2

私はweb-chatを作りました。最後に追加されたメッセージをページの一番下に表示したいと思います。最後に追加したアイテムの最後の10個のアイテム

私のSQLクエリは、今のようになります。

SELECT * FROM messages WHERE chat_room=5 LIMIT 10 

しかし、これは私が望むようにしないで動作します。メッセージがあるテーブルに20個のアイテムがある場合、このクエリでは1から10のアイテムが選択されますが、10から20まで、最後に最後のメッセージが必要です。

表メッセージUNIX時刻形式の列CREATE_DATE(INT)このクエリを変更する方法

を持っていますか?

答えて

4

Arnepの答えは、しかし、それは上部の最後のメッセージでリストを返します、ほぼ正しいです....

SELECT * 
FROM 
(SELECT * 
    FROM messages 
    WHERE chat_room=5 
    ORDER BY your_date_column DESC 
    LIMIT 10) ilv 
ORDER BY your_date_column ASC 
+0

+1良い点、私たちは皆最後のメッセージについては一言も欠落していました。 –

3

追加された日付までに注文する必要があります。これは、行がテーブルに挿入された順序で格納され、取得されることを保証しないためです。列your_date_columnには、各メッセージの日時が入ります。

SELECT * FROM messages WHERE chat_room=5 ORDER BY your_date_column DESC LIMIT 10 
+0

近く - しかしhavnigは、最新の10を選択し、OPはを求めましたこれらを昇順にソートする – symcbean

+0

結果を順序付ける別のクエリーに入れてください。ASC 'SELECT * FROM(SELECT * FROM messages ... ORDER BY your_date_column DESC LIMIT 10)AS sq ORDER BY your_date_column ASC' – Mchl

+0

@Mchlありがとう修正のために:-) – arnep

3

正しい順序でデータを要求する必要があります。

SELECT * FROM messages WHERE chat_room=5 ORDER BY message_ID DESC LIMIT 10 
+0

auto_increment_incrementが1に設定された単一のノードでのみ動作します – symcbean

+0

@symcbeanあなたは正しいですが、そのような列が存在する場合は、日付フィールドよりも良い選択です。なぜなら、10を選択したあいまい性が決してないからです。ただし、この日付フィールドまたはID列の例では、それほど大きな違いはなく、どちらの解決策も機能します。私は質問に答えるために列名を推測しなければならなかった。 –

+0

「最近の10」を話すとき、「あいまいさはありません」という意味は分かりません。事実は10の最も高い自動IDは最近の10の行にマップされないかもしれません、そして、複製されたマルチマスターセットアップはその良い例です。要点:行を時間順に並べ替えるには、一時的なデータ型の列を使用して並べ替えます。 – Mchl

2

よう

何かがジャストタイムスタンプのようなインデックスや、あなたの行IDで注文して。

SELECT * FROM messages WHERE chat_room=5 ORDER BY timestamp LIMIT 10 
関連する問題