Mysql 如何获得相同的结果而不仅禁用\u FULL\u GROUP\u BY

Mysql 如何获得相同的结果而不仅禁用\u FULL\u GROUP\u BY,mysql,sql,group-by,Mysql,Sql,Group By,以下查询是在MySQL中通过禁用ONLY\u FULL\u GROUP\u后完成的。现在我想要相同的结果,而不禁用仅\u FULL\u GROUP\u BY模式,如GROUP BY r.user\u id、u.fullname、r.time\u take SELECT u.fullname, ROUND(AVG(r.correct), 2) avg_correct, date_format(r.time_taken,'%d-%m-%Y') time_taken FROM (SELECT user

以下查询是在MySQL中通过禁用
ONLY\u FULL\u GROUP\u后完成的。现在我想要相同的结果,而不禁用
仅\u FULL\u GROUP\u BY
模式,如
GROUP BY r.user\u id、u.fullname、r.time\u take

SELECT u.fullname, ROUND(AVG(r.correct), 2) avg_correct, date_format(r.time_taken,'%d-%m-%Y') time_taken
FROM (SELECT user_id, concat( first_name, ' ', last_name) fullname from user) u
LEFT JOIN test_result r ON u.user_id = r.user_id
GROUP BY r.user_id
ORDER BY r.time_taken DESC
截图:


有人能帮我吗?

您必须将
u.fullname
添加到
group by
子句中,这不会影响结果,因为用户的id和全名是唯一地分组在一起的,但是在
花费时间的情况下
您必须使用:


您可以在此处找到更多信息:

我建议将此查询编写为:

SELECT CONCAT(u.first_name, ' ', u.last_name) as fullname,
       ROUND(AVG(r.correct), 2) as avg_correct,  
       DATE_FORMAT(MAX(r.time_taken), '%d-%m-%Y') as time_taken
FROM user u LEFT JOIN
     test_result r
     ON u.user_id = r.user_id
GROUP BY u.user_id, fullname
ORDER BY MAX(r.time_taken) DESC;
注:

  • FROM
    子句中的子查询对查询没有帮助。这可能会妨碍优化器
  • 不要按
    左联接中第二个表中的
    列进行分组(除非您确实知道自己在做什么)。对于不匹配项,该值将为
    NULL
  • MySQL和MariaDB允许在
    GROUPBY
    子句中使用列别名
  • 要使“排序依据”
按您的意愿工作,它需要在格式化之前的值上,而不是格式化之后的值上。格式
%d-%m-%Y
不按时间排序
r.correct和r.time_的值是任意的。您必须定义一个逻辑,选择哪个值为MIN/MAX/。。。。执行查询后出现此错误:函数db_test.any_值不存在@forpasWhy?你的Mysql版本是什么?自5.7版(或之前?)起,任何值都存在。无论如何,将:
任何值(r.time)替换为
max(r.time)
min(r.time)
MySQL版本:
10.1.37-MariaDB
只有完整组的人被禁用您的标签是MySQL。我知道MariaDB不支持任何_value(),也许现在仍然不支持。而是使用min()或max()。
SELECT CONCAT(u.first_name, ' ', u.last_name) as fullname,
       ROUND(AVG(r.correct), 2) as avg_correct,  
       DATE_FORMAT(MAX(r.time_taken), '%d-%m-%Y') as time_taken
FROM user u LEFT JOIN
     test_result r
     ON u.user_id = r.user_id
GROUP BY u.user_id, fullname
ORDER BY MAX(r.time_taken) DESC;