Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有可能以更好的方式编写这个mysql语句?克莱内尔?更具可读性?更快?_Mysql - Fatal编程技术网

有没有可能以更好的方式编写这个mysql语句?克莱内尔?更具可读性?更快?

有没有可能以更好的方式编写这个mysql语句?克莱内尔?更具可读性?更快?,mysql,Mysql,我有两个表,用户和结果 结果包含与用户表相同的列user\u id 我想抓取结果表,求结果值列的和,然后使用用户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 B

我有两个表,用户和结果

结果包含与用户表相同的列
user\u id

我想抓取结果表,求结果值列的和,然后使用用户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的初学者,我想知道我是否在做一些愚蠢的事情,或者也许它有效,但是有更好(更快)的方法来做同样的事情吗?

你的方法实际上很好。可以在不使用
分组方式的情况下编写,这可能更容易理解:

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

您可能会注意到,使用表别名有助于提高查询的可读性。

基础看起来不错。主要的是要确保你有合适的索引。此外,还应该在GROUPBY子句中命名所有非聚合列(在MySQL中不是100%必需的,但在其他一些SQL风格中,不这样做可能会导致为这些列返回不确定的值)

您还可以使用更现代的语法进行连接:-

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

为什么要在2点之前下单?这意味着什么?它只是意味着
orderby
列号
2
SELECT
列表中-必须以较短的方式编写
orderby DESC
在您的情况下只写:ORDER BY rsum不是更容易吗?无论如何,谢谢你的帮助。。。这是我编写sql语句的新风格,而不是我的一行代码:PCan你能帮我提个问题吗:@15256041?根据mysql的版本,使用这样的子选择可能比使用group by慢得多。