【问题标题】:Select query ordered by two subselects that depend on the outer query由依赖于外部查询的两个子选择排序的选择查询
【发布时间】:2014-06-11 14:32:39
【问题描述】:

我有以下带有示例数据的 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|
+--+-------+------+

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

所以是这样的:

SELECT v.user_id, SUM(v.points) FROM vote v ORDER BY SUM(v.points) DESC, (Number of 3 points) DESC, (Number of 2 points) DESC GROUP BY v.user_id

我正在努力设置两个子查询,因为我不知道如何跟踪当前的user_id

所以在上述数据的情况下,我想要以下结果:

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

用户3是第一,因为他总共有5分,用户1是第二名,因为他有一次3分(比用户2多一个)。

这可以用 SQL 实现吗?

【问题讨论】:

    标签: mysql sql subquery correlated-subquery


    【解决方案1】:

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

    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 byorder by 之前 :)

    【讨论】:

    • 哇,看起来不错。我有点不确定 JOIN 到底是什么。你能解释一下查询吗?那太棒了。
    • 肯定的事情......所以基本上我使用那个连接来创建一个空白变量..然后我将它设置为等于 2 或 1 或 0 取决于它是 3 还是 2 或1...这样我就可以轻松地在该字段上订购
    • 但是可以有多次三点。据我所知,它只是将其设置为 2、1 或零,无论用户实际拥有多少三分。但这很重要。
    • 你能提供一个 sql fiddle 的例子,它没有输出正确的结果吗?我可以弄乱它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2012-04-13
    • 1970-01-01
    相关资源
    最近更新 更多