如何在GROUP BY之前对此数据库进行排序?

10 浏览
0 Comments

如何在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"];

0
0 Comments

问题的原因是使用了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`。这一点在同一日期可能有两场比赛在同一课程上时尤为重要。

0
0 Comments

问题的出现原因是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

通过这种方式,你将按照每个课程的最新日期进行排序,从而达到你想要的结果。

0
0 Comments

问题的出现原因是在查询中使用了GROUP BY子句,但没有使用聚合函数。在SELECT中只有普通列时,应该只使用GROUP BY。MySQL允许这种行为,但是这种用法是错误的。

解决方法是从查询中移除GROUP BY子句。如果没有聚合函数,就不应该使用GROUP BY。正确的做法是使用聚合函数或者仅查询普通列。

虽然MySQL在没有聚合函数和普通列的GROUP BY中不会报错,但是你真的不应该这样使用。查询应该始终使用正确的方式来执行。

0