mysql中的rank排序

一.前言

眾所周知,Oracle有分析函數排名 rank()的功能,而Mysql并沒有,畢竟一分錢一分貨,花錢的自然有它的花錢的道理。但Mysql也能通過一些手段也能達到我們的需求

二.場景

一般排序場景的大致有3種
1.按照查詢條件從高到低,正常排序如1,2,3,...
2.按照查詢條件從高到低,允許并列排序如1,2,2,3,...
3.按照查詢條件從高到低,允許并列,但與排序號不同如1,2,2,4,...(較少見)

三.實現

主要還是貼實驗代碼,比較直觀

先建個測試表sql_rank
CREATE TABLE `sql_rank` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(11) UNSIGNED NOT NULL,
`score` TINYINT(3) UNSIGNED NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB;

插入些測試數據
INSERT INTO sql_rank (user_id, score)
VALUES
(1, 50),
(2, 30),
(3, 20),
(4, 60),
(5, 80),
(6, 50),
(7, 70),
(8, 85),
(9, 60)
場景1

成績排名 -- 1 2 3 4 5 6

SELECT A.*, @rownum := @rownum + 1 AS rownum 
FROM
(SELECT * FROM sql_rank ORDER BY score DESC) AS A,
(SELECT @rownum := 0) B

實驗結果如下:


1.jpg
場景2

成績排名-- 1 2 2 4 4 6

SELECT 
  s1.id,
  s1.user_id,
  s1.score,
  (SELECT 
    COUNT(s.score) + 1 
  FROM
    sql_rank s 
  WHERE s.score > s1.score) rank 
FROM
  sql_rank s1 
WHERE s1.score IS NOT NULL 
ORDER BY s1.score DESC

實驗結果如下:


2.jpg
場景3

成績排名-- 1 1 2 3 4 4 5

解法一:(較推薦)
SELECT score,
(SELECT COUNT(DISTINCT score) FROM sql_rank WHERE score >= s.`score`) AS rank 
FROM sql_rank AS s ORDER BY score DESC
解法二:
SELECT score,
      (SELECT 
        COUNT(*) 
      FROM
        (SELECT DISTINCT 
          score AS s 
        FROM
          sql_rank) AS new_score 
      WHERE s >= score) rank 
    FROM
      sql_rank 
ORDER BY score DESC

實驗結果如下:


3.jpg

小結:
在我們業(yè)務中有各種的排序需求,我們需要根據具體的業(yè)務來編寫相應的sql語句,此文章的總結也是剛好在工作有場景2的應用,查閱了度娘和谷哥,做了一些隨筆筆記。(侵刪,謝謝)

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 前面的章節(jié)我們介紹了如何設計最優(yōu)的庫表結構、 如何建立最好的索引, 這些對于高性能來說是必不可少的。 但這些還不夠...
    好好學習Sun閱讀 2,774評論 0 38
  • 一. Java基礎部分.................................................
    wy_sure閱讀 4,012評論 0 11
  • MySQL不權威總結 歡迎閱讀 本文并非事無巨細的mysql學習資料,而是選擇其中重要、困難、易錯的部分進行系統地...
    liufxlucky365閱讀 2,811評論 0 26
  • 什么是數據庫? 數據庫是存儲數據的集合的單獨的應用程序。每個數據庫具有一個或多個不同的API,用于創(chuàng)建,訪問,管理...
    chen_000閱讀 4,143評論 0 19
  • 1、早6晚11 2、約見80位朋友(己見5位:李老師、珍珍、琴蘭、榮梅、曉麗) 3、周檢視(3/12)月檢視(0/...
    生嬌營養(yǎng)師閱讀 171評論 2 0

友情鏈接更多精彩內容