4

各メンバーの最も高い最後の行を選択したい。

ID     UID      POINT        DATE           TIME

1       1         5       2012-11-29      11:29:03    
2       2        10       2012-11-29      11:38:12    
3       1        10       2012-12-02      05:15:01    
4       3         5       2012-12-02      09:51:34    
5       2         5       2012-12-02      12:14:14    
6       3         5       2012-12-04      12:18:30
7       1         5       2012-12-05      06:00:51

そこで、各ユーザーのポイントが最も高いID、UID、POINTを選択したいと思います。結果は次のようになります。

ID     UID      POINT        DATE           TIME

2       2        10       2012-11-29      11:38:12    
3       1        10       2012-12-02      05:15:01      
6       3         5       2012-12-04      12:18:30

私はこれで試しました:

SELECT distinct uid, point, id FROM `test` 
GROUP By uid ORDER BY date DESC, time DESC

SELECT id, uid, point FROM `test` 
GROUP BY uid ORDER BY date DESC, time DESC

しかし、私はいくつかの間違った結果を得ました:

4(3), 2(2), 1(1)
4

8 に答える 8

3

このクエリは、各ユーザーの最高点を選択します。

select uid, max(`points`)
from members
group by uid

これにより、ユーザーが最大ポイントを持つ最大IDが選択されます。

select uid, max(id)
from members
where (uid, `points`) in (select uid, max(`points`)
                          from members
                          group by uid)
group by uid

これが必要な最後のクエリです。

select members.*
from members
where (uid, id) in (
  select uid, max(id)
  from members
  where (uid, `points`) in (select uid, max(`points`)
                            from members
                            group by uid)
  group by uid)

それは示す:

ID  UID  POINT  DATE        TIME
2   2    10     2012-11-29  11:38:12    
3   1    10     2012-12-02  05:15:01      
6   3    5      2012-12-04  12:18:30

これも同じ結果になり、より単純に見えます。

SELECT s.*
FROM
  (SELECT members.*
   FROM members
   ORDER BY uid, points desc, id desc) s
GROUP BY uid

常に機能すると思いますが、文書化されていません。

最後のクエリの簡単な説明:MySqlを使用すると、groupbyクエリで非集計フィールドを選択できます。ここでは、uidすべての列をグループ化していますが、選択しています。ドキュメントには、集約されていない列の値は未定であると記載されていますが(グループ内の任意の値にすることができます)、実際にはMySqlは最初に検出された値を返します。また、順序付けられたサブクエリで非集計列を使用してgroup byを適用しているため、最初に検出された値が必要な値になります。

于 2012-12-20T09:46:50.080 に答える
3

試す:

SELECT id, uid, MAX(point) FROM `test` GROUP BY uid ORDER BY date DESC, time DESC
于 2012-12-20T09:38:53.447 に答える
1

クエリ:

SQLFIDDLEEXample

SELECT t1.*
FROM Table1 t1 
WHERE t1.ID = (SELECT MAX(t3.ID)
               FROM Table1 t3
               WHERE t1.UID=t3.UID
               AND t3.POINT=(SELECT  MAX(t2.POINT)
                               FROM Table1 t2
                               WHERE t2.UID = t3.UID))

結果:

| ID | UID | POINT |                            DATE |     TIME |
-----------------------------------------------------------------
|  2 |   2 |    10 | November, 29 2012 00:00:00+0000 | 11:38:12 |
|  3 |   1 |    10 | December, 02 2012 00:00:00+0000 | 05:15:01 |
|  6 |   3 |     5 | December, 04 2012 00:00:00+0000 | 12:18:30 |
于 2012-12-20T10:04:40.263 に答える
1

これを試して :

SELECT id, uid, point FROM `test` 
GROUP BY uid 
ORDER BY point DESC, date DESC, time DESC
于 2012-12-20T09:36:37.467 に答える
0

このように簡単です:

SELECT * FROM (SELECT * FROM `points` ORDER BY point DESC) AS `t1` GROUP BY uid;
于 2012-12-20T10:08:11.180 に答える
0

これは正しいものです:

SELECT ID, UID, MAX(POINT) FROM `test` GROUP BY UID ORDER BY DATE DESC, TIME DESC
于 2012-12-20T09:46:42.743 に答える
0

クエリ:

SELECT x.*
FROM (SELECT p.*
FROM points p
ORDER BY uid, point desc, id desc) as x
GROUP BY x.uid
;

結果:

ID  UID     POINT   DATE                                TIME
3   1       10      December, 02 2012 00:00:00+0000     January, 01 1970 05:15:01+0000
2   2       10      November, 29 2012 00:00:00+0000     January, 01 1970 11:38:12+0000
6   3       5       December, 04 2012 00:00:00+0000     January, 01 1970 12:18:30+0000
于 2012-12-20T09:47:41.050 に答える
0

SELECT max(point), id, uid FROM test GROUP BY uid ORDER BY point DESC

このように使用すると、問題が解決します。

于 2012-12-20T10:27:04.577 に答える