2011-02-10 6 views
5

my mysqlテーブルから一意の値を持つ最新の行を取得する必要があります。 シンプルなテーブルレイアウトは、タイムスタンプ(now())とユーザー名列です。 テーブルは新しいデータを数秒で取得します。ユーザー名が一意の最新の行が必要です。MYSQLクエリ:最新のタイムスタンプ+最後の30分の一意の値

SELECT MAX(timestamp) as timestamp, username 
    FROM bla 
    WHERE timestamp < (now() - interval 30 minute) 
    GROUP BY username 
    ORDER BY timestamp DESC 

あなたは最後の30分を見しようとしている場合は、その後、

+0

- Andomarによって別の同様の答え ​​

これは、詳細かつ明確言葉で作品にどのようにGROUPを説明する良い記事です過去30分以内に挿入されたユーザーですか?また、 'timestamp'はmysql内の予約語であることに注意してください。フィールドには別の名前を使用するか、バッククォートで "エスケープ"する必要があります。 –

+0

はい、私の列はタイムスタンプの値に別の名前を使用しています。これは単なる例でした。 – HyperDevil

答えて

2
SELECT MAX(timestamp) as timestamp, username 
    FROM bla 
    WHERE timestamp > (now() - interval 30 minute) 
    GROUP BY username 
    ORDER BY timestamp DESC 
6

...グループは、私がいけない何かをやっているせいか、このクエリは、最新の値を返さないようです私はあなたが「より小さい」よりも「より大きい」を使用したいと思います。

... WHERE timestamp > (now() - interval 30 minute) ... 
+0

+1 [Submit]をクリックしています。ニース - あなたはより速く入力します。 ;-) –

+0

おっと私はそれを見ましたが、結果はまだ最新の値を表示していません。 – HyperDevil

+0

@HyperDevil:行が2 /秒の割合で挿入された場合、実際のデータに対してクエリの結果を検証するのは難しいでしょう。 –

3

何を書いたことは仕事をしていますが、より高速なソリューションは、LEFTを使用するかもしれない、私は左に取り組んでいるDBに登録しよ実際にあなたが得ることを追加ボーナス/ wの二倍の速さで登録しよう最新の行からすべての列あなたがその情報を必要とします。

SELECT * 
    FROM `bla` 
    WHERE bla.created_at > (now() - interval 30 minute) AND (next_bla.created_at IS NULL) 
    LEFT JOIN bla next_bla ON bla.username = next_bla.username AND bla.created_at < next_bla.created_at 
    ORDER BY bla.created_at DESC 

これは、同じユーザー名/ wのタイムスタンプで、次の行のw/BLA内のすべての行に一致し、次のを持っていない行を選びますrow(next_bla.created_at IS NULL)、つまり、最も新しい行です。

LIMIT句を使用してパフォーマンスを向上させることもできます。だから、基本的にはそれぞれの最新の行をしたいMySQL "Group By" and "Order By"

0

SELECT MAX(timestamp) as timestamp, username 
    FROM bla 
    WHERE timestamp > date_sub(now(), interval 30 minute) 
    GROUP BY username 
    ORDER BY timestamp DESC 
関連する問題