登录
首页 >  数据库 >  MySQL

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

来源:SegmentFault

时间:2023-01-14 20:56:30 227浏览 收藏

对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《Mysql查询排序,使用变量解决达到条件优先排序的问题》,主要介绍了MySQL,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

原题是一位同学的提问 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 查询,查找所有至少连续出现三次的数字。

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

以上就是《Mysql查询排序,使用变量解决达到条件优先排序的问题》的详细内容,更多关于mysql的资料请关注golang学习网公众号!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表