GROUP BY name和ORDER BY point&时间MYSQLi

时间:2018-01-21 22:48:39

标签: mysqli

我是这个论坛的新手,我希望能找到解决我问题的方法。

我有这张桌子:

name     time  points  car    date
Daniel | 55s | 210   | red   |20/01/2018
Daniel | 45s | 250   | green |21/01/2018
Julie  | 54s | 220   | red   |19/01/2018
Julie  | 33s | 150   | yellow|22/01/2018

我希望像这样排序

name     time  points  car    date
Daniel | 45s | 250    |green |21/01/2018
Julie  | 54s | 220    |red   |19/01/2018

首先按点排序,而不是按时间排序和按名称分组(可选择计数)

我用这个

    SELECT NAME, MAX(POINTS) POINTS, MAX(TIME) TIME, MAX(CAR) CAR, MAX(DATE) DATE
 FROM ( SELECT A.* FROM test A LEFT OUTER JOIN test B ON A.NAME=B.NAME AND
 A.POINTS<B.POINTS AND A.TIME>B.TIME WHERE B.NAME IS NULL ) as sub GROUP BY NAME

我得到了这个:

 name   POINTS  TIME    CAR     DATE    
Daniel  250     45    green     2018-01-21
Julie   220     54    yellow    2018-01-22
朱莉应该有车=红色&amp; 2018年1月19日 丹尼尔看起来不错

我怎样才能得到这个值(汽车和日期)?

感谢 尼科

2 个答案:

答案 0 :(得分:0)

你可以试一试。它包含反对自己的表,只获得具有最高点和最短时间的记录。

SELECT NAME, MAX(POINTS) POINTS, MAX(TIME) TIME
FROM
(
    SELECT A.* FROM test A
        LEFT OUTER JOIN test B ON A.NAME=B.NAME AND A.POINTS<B.POINTS AND A.TIME>B.TIME
    WHERE B.NAME IS NULL
) GROUP BY NAME

如需更多信息,请尝试以下操作:

SELECT * FROM
(
SELECT OUTERTEST.*,
    @row_num := IF(@prev_value=OUTERTEST.name,@row_num+1,1) AS RowNumber,
    @prev_value := OUTERTEST.name
FROM (SELECT * FROM TEST ORDER BY NAME, TEST.POINTS DESC, TEST.TIME ASC) OUTERTEST, (SELECT @row_num := 1, @prev_value := '') x
) A
WHERE A.ROWNUMBER=1

答案 1 :(得分:0)

我用这张表做了更多测试

id  name    time    points
1   Daniel  55      1140
2   Judie   54      1144
3   Judie   33      1028
4   Daniel  45      1180
5   Judie   53      1148

我申请此请求

SELECT NAME, MAX(POINTS) POINTS, sub.TIME FROM (SELECT * FROM Testpoint ORDER BY POINTS DESC, TIME ASC) AS sub
GROUP BY sub.name

我有每个名字的最高分,但时间不是正确的

 name   POINTS  time    
Daniel  1180    55
Judie   1148    54

Judie应该有53个时间而不是54个

我做错了什么?

三江源 尼科