Mysql 如何获得相同的结果而不仅禁用\u FULL\u GROUP\u BY
以下查询是在MySQL中通过禁用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
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;