0

这是我正在处理的表

mysql> SELECT * FROM reacts;
+-----+--------------------+--------------------+--------------------+---------+-----------+
| id  | userid             | messageid          | channelid          | upvotes | downvotes |
+-----+--------------------+--------------------+--------------------+---------+-----------+
|   1 | 226790622768398336 | 621659327299715072 | 446794429597220868 |       1 |         1 |
|   3 | 226790622768398336 | 621662271642402817 | 446794429597220868 |       2 |         2 |
|   4 | 226790622768398336 | 621662782403903489 | 446794429597220868 |       2 |         1 |
|   5 | 226790622768398336 | 621663464527757313 | 446794429597220868 |       2 |         2 |
|   6 | 226790622768398336 | 621666397768122379 | 446794429597220868 |       3 |         2 |
|   7 | 276500077248512010 | 621669530996965383 | 446794429597220868 |       1 |         1 |
|   8 | 276500077248512010 | 621669605156323328 | 446794429597220868 |       1 |         1 |
|   9 | 276500077248512010 | 621669704653733889 | 446794429597220868 |       2 |         1 |
|  10 | 276500077248512010 | 621669842575032341 | 446794429597220868 |       2 |         1 |
+-----+--------------------+--------------------+--------------------+---------+-----------+

我想SELECTMAX.SUM(upvotes - downvotes)

我已经尝试从这里调整示例,但没有成功。

简而言之,我想做一个应该是这样的查询(伪代码):

SELECT id, 
       messageid, 
       channelid, 
       MAX(SUM(upvotes - downvotes))) AS total 
FROM reacts;

编辑

对于这个数据样本,输出应该是这样的:


+-----+--------------------+--------------------+--------------------+-------+
| id  | userid             | messageid          | channelid          | total | 
+-----+--------------------+--------------------+--------------------+-------+
|   4 | 226790622768398336 | 621662782403903489 | 446794429597220868 |     1 |
|   6 | 226790622768398336 | 621666397768122379 | 446794429597220868 |     1 |
|   9 | 276500077248512010 | 621669704653733889 | 446794429597220868 |     1 |
|  10 | 276500077248512010 | 621669842575032341 | 446794429597220868 |     1 |
+-----+--------------------+--------------------+--------------------+-------+

4

1 回答 1

5

如果您希望特定用户具有最大总和,并且您使用的是 MySQL 8+,那么窗口函数在这里会派上用场:

WITH cte AS (
    SELECT userid, SUM(upvotes - downvotes) AS diff,
        ROW_NUMBER() OVER (ORDER BY SUM(upvotes - downvotes) DESC) rn
    FROM reacts
    GROUP BY userid
)

SELECT userid, diff
FROM cte
WHERE rn = 1;

如果您只想要整个表中具有最大差异总和的单行,请使用LIMIT查询:

SELECT id, messageid, channelid, (upvotes - downvotes) AS diff
FROM reacts
ORDER BY diff DESC
LIMIT 1;

如果两条或多条记录碰巧在投票中的最大差异并列,并且您想查看所有关系,那么我们可以使用子查询来找到最大差异:

SELECT id, messageid, channelid, (upvotes - downvotes) AS diff
FROM reacts
WHERE (upvotes - downvotes) = (SELECT MAX(upvotes - downvotes) FROM reacts);

MySQL 不支持任何类型的 with ties 子句(其他数据库如 SQL Server 支持),因此我们需要一个正式的子查询。

于 2019-09-14T08:39:27.767 回答