mysql行

ldioqlga  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(163)

假设我有一个包含四列的表:firstname、lastname、number(不是主键)和status。如果一个人的名字、姓氏和号码相同,但身份不同(其中身份是字符串,如“king”或“queen”或“jack”)。
我想从表中检索所有列的所有值,但是如果有重复的值,其中有同名、姓和编号相同的值,我想获取状态为“king”的值,如果有一个没有“国王”身份的复制品,那么得到那些带有“王后”的,如果没有带有“国王”或“王后”的复制品,那么只得到一个带有“杰克”的。
基本上,优先顺序是国王,王后,然后是杰克。所以,我想要表中的所有值,但如果有重复项,则只包括优先级最高的值。我做了一些研究,发现除了mysql以外的sql实现还提供了诸如dense\u rank之类的函数,但是我需要在mysql中实现,我找不到任何方法。

h7wcgrx3

h7wcgrx31#

一种方法是 union all :

select t.*
from t
where t.status = 'King'
union all
select t.*
from t
where t.status = 'Queen' and
      not exists (select 1 from t t2 where t2.name = t.name andt2.status in ('King'))
union all
select t.*
from t
where t.status = 'Jack' and
      not exists (select 1 from t t2 where t2.name = t.name and t2.status in ('King', 'Queen'));

另一种方法使用相关子查询:

select t.*
from t
where (name, field(t.status, 'King', 'Queen', 'Jack')) in
          (select t2.name, max(field(t2.status, 'King', 'Queen', 'Jack'))
           from t t2
           where t2.status in ('King', 'Queen', 'Jack')
           group by t2.name
          );
vojdkbi0

vojdkbi02#

尝试使用会话变量:

SET @row_number:=1;

SELECT
    FirstName,
    LastName,
    Number,
    Status
FROM(
    SELECT 
        @row_number:=
        CASE
            WHEN @FirstName = FirstName AND @LastName = LastName AND @Number = Number
            THEN @row_number + 1
            ELSE 1
        END AS num,
        @FirstName := FirstName as FirstName,
        @LastName := LastName as LastName,
        @Number := Number as Number,
        Status
    FROM
        t1
    ORDER BY 
        FirstName,
        lastName,
        Number,
        CASE 
            WHEN STATUS = 'King' THEN '1'
            WHEN STATUS = 'Queen' THEN '2'
            WHEN STATUS = 'Jack' THEN '3'
        END
    ) as ttt
WHERE num = 1;

相关问题