mysql - 选择查询由两个依赖于外部查询的子选择排序

标签 mysql sql subquery correlated-subquery

我有以下 SQL 架构(简化)和示例数据。

Table vote
+--+-------+------+
|id|user_id|points|
+--+-------+------+
| 1|      1|     3|
| 2|      1|     1|
| 3|      1|     0|
| 4|      2|     2|
| 5|      2|     2|
| 6|      2|     0|
| 7|      3|     2|
| 8|      3|     1|
| 9|      3|     2|
+--+-------+------+

我想要实现的是选择按总和点排序、按最多 3 点排序和按最多 2 点排序的 user_id。

所以像这样:

SELECT v.user_id, SUM(v.points) FROM vote v ORDER BY SUM(v.points) DESC, (3 分的数量) DESC, (2 分的数量) DESC GROUP BY v.user_id

我在设置两个子查询时遇到了困难,因为我不知道如何跟踪当前的 user_id

因此,对于上述数据,我想要以下结果:

+-------+------+
|user_id|points|
+-------+------+
|      3|     5|
|      1|     4|
|      2|     4|
+-------+------+

用户 3 排名第一,因为他总共获得了 5 分,用户 1 排名第二,因为他一次获得了 3 分(比用户 2 多了 1 分)。

这可以用 SQL 实现吗?

最佳答案

我相信你想要的是这样的...你不应该需要做子查询,而只是检查点,为其设置一个变量并按该变量排序...我需要测试更多示例数据,但它提供了所需的结果

SELECT 
  v.user_id, 
  SUM(v.points) as addedNum,
  if(
      v.points = 3, @a := 2, if(v.points = 2, @a := 1, @a := 0)
  ) as num_p_three_two
FROM vote v 
JOIN (select @a := 0, @b := 0) as temp
GROUP BY v.user_id
ORDER BY 
addedNum DESC,
num_p_three_two DESC;

SQL FIDDLE一起玩

我还更改了查询的顺序,因为 group by 位于 order by 之前:)

关于mysql - 选择查询由两个依赖于外部查询的子选择排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24165648/

相关文章:

mysql - 在 MySql 中存储 html 语法

sql - 在多列中向前填充 NULL 值

mysql - 使用具有 IF 和 IFNULL 的别名列的 Where 子句

mysql - SQL IN () 包含 NULL 值

mysql - 在 Controller 中执行 find 指定基本条件,但 cakephp 构建的查询与条件不匹配

php - CakePHP 3 : select data from multiple table

java - 用户 'root' @'localhost' 的访问被拒绝(使用密码 : YES) IN WAMPSERVER

MySQL 左连接子查询失败

mysql - 使用主键作为多个表的外键 -PHPMyAdmin

Python 线程和 SQL