是否有可能以更好的方式编写这个mysql语句? cleanere?更具可读性?快点?

时间:2013-03-07 09:04:31

标签: mysql

我有两个表,用户和结果。

结果包含与用户表相同的列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初学者,我想知道我是在做一些愚蠢的事情,或者它是否有效但是有更好的方法(更快)做同样的事情?

2 个答案:

答案 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