如何在GROUP BY之前对此数据库进行排序?
如何在GROUP BY之前对此数据库进行排序?
我为高尔夫记分卡制作了一个网站。我正在处理的页面是球员的个人资料。当您访问球员个人资料时,它按最后一次比赛的顺序显示每个球场(降序)。但是,由于下面的ORDER BY命令,最后一次比赛的顺序被打乱了。相反,当进行分组时,它选择了最早的日期,而不是最近的日期。\n分组完成后,它会按正确的顺序(降序)显示它们...只是由于球场按date_of_game升序分组,而不是降序,所以顺序是错误的。希望这不会太令人困惑...谢谢。\n
$query_patrol321 = "SELECT t1.*,t2.* FROM games t1 LEFT JOIN scorecards t2 ON t1.game_id=t2.game_id WHERE t2.player_id='$player_id' GROUP BY t1.course_id ORDER BY t1.date_of_game DESC"; $result_patrol321 = mysql_query($query_patrol321) or die ("在MySQL查询中出现错误:".mysql_error()); while ($row_patrol321 = mysql_fetch_array($result_patrol321)) { $player_id_rank = $row_patrol321["player_id"]; $course_id = $row_patrol321["course_id"]; $game_id = $row_patrol321["game_id"]; $top_score = $row_patrol321["total_score"];
问题的原因是使用了MySQL中不被推荐的非聚合列在GROUP BY子句中,当这些列的值不完全相同时,MySQL无法确定选择哪个值。解决方法是通过插入逻辑来获取最大日期,而不是依赖于列的排序或MySQL的未记录特性。下面的查询使用了子查询来找到每个课程的最新日期,并且没有使用GROUP BY子句来实现目标。
SELECT t1.*, t2.* FROM games t1 LEFT JOIN scorecards t2 ON t1.game_id=t2.game_id WHERE t2.player_id='$player_id' and t1.date_of_game in (select MAX(date_of_game) from games g join scorecards ss on g.game_id = ss.game_id and ss.player_id = '$player_id' where t1.course_id = g.course_id ) GROUP BY t1.course_id ORDER BY t1.date_of_game DESC
如果`game_id`是自增的,可以使用它来代替`date_of_game`。这一点在同一日期可能有两场比赛在同一课程上时尤为重要。
问题的出现原因是MySQL允许在GROUP BY查询中添加非聚合列,而且MySQL的行为是选择与组合匹配的第一行。这导致了混淆和不一致的结果。
解决方法是通过在查询中使用ORDER BY子句来按照最新的日期排序。具体的解决方法如下所示:
SELECT
t1.* -- 最好列出你想要的聚合
,t2.* -- 你真正想要的是哪些列?
FROM
games t1
LEFT JOIN
scorecards t2
ON t2.[game_id] =t1[.game_id]
WHERE
t2.[player_id]='$player_id'
GROUP BY
t1.[course_id]
ORDER BY
MAX(t1.[date_of_game]) DESC
通过这种方式,你将按照每个课程的最新日期进行排序,从而达到你想要的结果。