我有两个表,用户和结果。
结果包含与用户表相同的列user_id
。
我想获取结果表,求和results_value列,然后使用user_id从用户表中获取其他信息....我想出了这个:
SELECT results.user_id, SUM(results.result_value), users.user_name, users.user_pic, users.user_level
FROM results, users
WHERE users.user_id = results.user_id
GROUP BY results.user_id
ORDER BY SUM(results.result_value) DESC
LIMIT 4
它确实有效,但作为一个完整的mysql初学者,我想知道我是在做一些愚蠢的事情,或者它是否有效但是有更好的方法(更快)做同样的事情?
答案 0 :(得分:0)
你的方法实际上很好。可以在没有GROUP BY
的情况下编写它,它可能更容易理解:
SELECT
u.user_id,
( SELECT sum(r.result_value)
FROM results r
WHERE r.user_id = u.user_id
) AS rsum,
u.user_name,
u.user_pic,
u.user_level
FROM users u
ORDER BY 2 DESC
LIMIT 4
正如您所注意到的,使用表别名对查询的可读性有很大帮助。
答案 1 :(得分:0)
基础知识很好看。主要是确保你有合适的索引。此外,您应该拥有GROUP BY子句中指定的所有非聚合列(在MySQL中不是100%必需的,但在SQL的其他一些版本中,并且不这样做会导致为这些列返回不确定的值)。
您还可以使用更现代的语法来执行JOIN: -
SELECT results.user_id, SUM(results.result_value) AS Asum, users.user_name, users.user_pic, users.user_level
FROM results
INNER JOIN users
ON users.user_id = results.user_id
GROUP BY results.user_id, users.user_name, users.user_pic, users.user_level
ORDER BY Asum DESC
LIMIT 4