我有一个包含userID,highscore和时间戳的表。
我想按时间戳排序,以便最新的条目位于顶部,而且,在列表中不显示任何两次用户ID,ergo,它们需要分组。
我还需要按分数排序。
$sql="SELECT * FROM $table GROUP BY userID ORDER BY time DESC";
$ sql2 =“SELECT * FROM $ table GROUP BY userID ORDER BY score DESC”;
此时,我看到Group by先完成,所以我可能只是得到一些随机的时间戳/标记。我需要先订购它们,然后将它们分组。但是,如果我切换Group by和Order by,我会收到错误。
有人可以帮帮我吗?感谢。
答案 0 :(得分:1)
GROUP
总是在ORDER
之前完成。要在分组之前订购记录,有两种方法:
ORDER BY
,然后应用GROUP BY
。这通常不是更好的方法,因为运行子查询非常昂贵,尤其是如果您有许多记录。对于少量记录,这将没有问题。
$sql="SELECT * FROM (SELECT * FROM $table ORDER BY time DESC) GROUP BY userID";
更好的解决方案是在子查询中获取MAX(time)
,然后在userID
和最长时间将其加入到您的表中。
SELECT p1.*
FROM $table t1
INNER JOIN
(
SELECT max(time) MaxTime, userID
FROM $table
GROUP BY userID
) t2
ON t1.userID = t2.userID
AND t1.time = t2.MaxTime
order by t1.time DESC;
我是从头顶写下来的。
HTH