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
相關文章
相關標籤/搜索