原题是一位同学的提问 mysql查询排序

给一组按照时间排序的所有人消费数据,要求依次查出消费满10元的人(按照消费满10元的时间排序)。

这题看起来很简单,似乎使用sum+排序就可以解决,但是问题就出在如何按照消费满10元的时间来排序,这就意味着我们在查询中要按照用户消费的累加值来判断。
这在程序中很好解决,一次循环遍历就可以完成,但是在一条SQL中不好实现。我的思路是这样的:

1.用一个变量来标识用户的消费累计值,记录用户的消费数据,先循环一遍数据,得到每个用户当前消费记录时的总消费额
2.以上存在一个问题,该数据是针对所有数据使用时间排序的,如果只用一个变量进行累加计数,得到的是所有人的值,没法分组记录
3.把全部数据优先按照用户来排序,使用用户+消费时间排序,即可把不同用户的数据划分开。
4.再加入一个变量,用来记录遍历过程中用户值的变化,当用户值发生变化时,消费累计值归零,进行一次查询。
5.在以上查询出的数据上,查出每个用户第一条累计值大于等于10的记录,然后按照消费时间进行排序,即可得到最终数据

以下是sql:

SELECT
  d.name,
  d.id,
  d.allpay
FROM
  (SELECT
    id,
    @allpay := c1.pay + (
      CASE
        WHEN @name = c1.name
        OR @name = ''
        THEN @allpay
        ELSE 0
      END
    ) AS 'allpay',
    @name,
    pay,
    @name := c1.name AS 'name'
  FROM
    (SELECT
      *
    FROM
      consumes
    ORDER BY NAME,
      id) c1,
    (SELECT
      @allpay := 0) a,
    (SELECT
      @name := '') b) d
WHERE d.allpay >= 10
GROUP BY d.name
ORDER BY id

之前刷过LeetCode的数据库题,其中有一题和这题的解题思路非常相似。

编写一个 SQL 查询,查找所有至少连续出现三次的数字。

+----+-----+
| Id | Num |
+----+-----+
| 1  |  1  |
| 2  |  1  |
| 3  |  1  |
| 4  |  2  |
| 5  |  1  |
| 6  |  2  |
| 7  |  2  |
+----+-----+

例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。

+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+
SELECT DISTINCT
  al.Num AS ConsecutiveNums
FROM
  (SELECT
    @count := @count + (
      CASE
        WHEN @num = e.Num
        THEN 0
        ELSE 1
      END
    ) AS c,
    e.Num,
    @num := e.Num
  FROM
    LOGS e,
    (SELECT
      @count := 0) a,
    (SELECT
      @num := - 1) b) al
GROUP BY al.c,
  al.num
HAVING COUNT(*) >= 3

穷凶极恶丶带恶人
441 声望1 粉丝

正在学webpack/mock