【问题标题】:Ranking by Group in MySQL在 MySQL 中按组排序
【发布时间】:2013-08-24 01:22:44
【问题描述】:

我有一张表,一列如下:

name
-------
Michael
Michael
Michael
Michael
John
John
John
Alex
Alex

我需要给他们排名:

name    | rank
--------|------
Michael |1
Michael |2
Michael |3
Michael |4
John    |1
John    |2
John    |3
Alex    |1
Alex    |2

我该怎么做?

【问题讨论】:

    标签: mysql rank


    【解决方案1】:

    mysql 中没有任何东西可以让您直接执行此操作,但您可以破解它:

    SET @prev := null;
    
    SET @cnt := 1;
    
    SELECT name, IF(@prev <> name, @cnt := 1, @cnt := @cnt + 1) AS rank, @prev := name
    FROM yourtable
    ORDER BY name
    

    使用相同的基本逻辑,在您的客户端应用程序中更容易完成这类事情。

    【讨论】:

    • 由于为空值,Micheal 的排名从 2 (2,3,4,5) 开始。如果我设置@prev := 'string',结果是正确的。谢谢。
    • 马克,请通过以下评论查看。在 MySql 中做到这一点并不难
    • 这并不可靠,因为读取@prev 和写入它(在单个SELECT 中)的评估顺序没有定义。见dev.mysql.com/doc/refman/5.5/en/user-variables.html
    【解决方案2】:

    简单,

    CREATE TABLE customer (
    name CHAR(30) NOT NULL,
    rank MEDIUMINT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (name,rank)) ENGINE=MyISAM;
    
    INSERT INTO customer (name) VALUES
    ('Michael'),('Michael'),('John'),('Alex'),('Michael'),('John');
    
    SELECT * FROM customer ORDER BY name,rank;
    

    【讨论】:

    • 是的,现在您有了一个简单的数字序列。 OP 想要一个序列 PER 名称,而不是每个表。
    • 它将按照他想要的方式工作,它只会根据名称添加一个序列。试试看吧。
    • 这是一个很棒的技巧。我已经为这个特定的答案来过 Stack Overflow 六次了。
    • 这既晦涩又精彩!也可以使用临时表来完成,以供实际使用。
    • 如果表中的主键 ID 列也是自动递增的怎么办?
    猜你喜欢
    • 2017-08-11
    • 2017-10-07
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2010-11-10
    • 2012-11-05
    相关资源
    最近更新 更多