原题是一位同学的提问 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的数据库题,其中有一题和这题的解题思路非常相似。
+----+-----+
| 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。