0

次のようなテーブル構造があります。

Name    Time

Joe     2012-02-22 22:11:26.0
Joe     2012-02-22 21:01:23.0
Sue     2012-02-22 20:57:10.0
john    2012-02-22 18:13:36.0
Fred    2012-02-22 16:56:57.0
Joe     2012-02-22 14:38:45.0
Joe     2012-02-22 14:38:45.0
Ralph   2012-02-22 14:26:20.0
...     ...
(more Names and Times)
...     ...
john    2010-03-10 15:27:39.0
john    2010-03-10 15:46:59.0

時間順に上位 3 つの名前を探しています。したがって、結果は次のようになります。

Joe, Sue, john

次のようなクエリから始めました。

SELECT Name FROM table ORDER BY LOWER(TIME) DESC

だから私は結果を制限したかった:

SELECT Name FROM table ORDER BY LOWER(TIME) DESC LIMIT 0 , 3

しかし、結果は最初の 3 行をアスペクトとして示しています。

Joe, Joe, Sue

今、最初に名前でクエリをグループ化しようとしています:

SELECT Name FROM table GROUP BY Name ORDER BY LOWER(TIME) DESC LIMIT 0 , 3

はい、それは私に3つの異なる名前を与えますが、再現不可能な順序です. ここで何か不足していますか?ここで正しい構文は何でしょうか?

4

1 に答える 1

2
SELECT DISTINCT Name
FROM table
ORDER BY Time DESC
LIMIT 3

したがって、基本的にはDISTINCT、2 番目のクエリに追加するだけで済みます。これにより、MySQL は一意の値のみを選択するようになります。グループ化する必要はありません。UPD :ほとんどの場合を使用するため、 のORDER BY後に適用されるため、これは間違っています。DISTINCTDISTINCTGROUP BY

PS を使用する理由がわかりませんLOWER。この関数は、文字列を小文字にします。しかし、2 番目の列は型DATETIME(私が推測する) であるため、文字列を操作していませんか?

UPD:グループ化を使用する必要があります。例を次に示します。

SELECT Name
FROM table
GROUP BY Name
ORDER BY MAX(Time) DESC
LIMIT 3

ここで重要なことは、各グループから最大の日付/時刻を取得し、それによって順序付けすることです。

于 2012-04-13T23:41:32.233 に答える