Mysql查询排序,使用变量解决达到条件优先排序的问题

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

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

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

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

如下是sql:segmentfault

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的数据库题,其中有一题和这题的解题思路很是类似。code

编写一个 SQL 查询,查找全部至少连续出现三次的数字。排序

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

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

+-----------------+
| 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
相关文章
相关标签/搜索