Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于优先级值的MySQL行_Mysql_Sql - Fatal编程技术网

基于优先级值的MySQL行

基于优先级值的MySQL行,mysql,sql,Mysql,Sql,假设我有一个包含四列的表:FirstName、LastName、Number(不是主键)和Status。如果一个人的名字、姓氏和号码相同,但身份不同(其中身份是一个字符串,如“国王”或“王后”或“杰克”) 我想从表中检索所有列的所有值,但如果存在同名、姓和编号相同的重复项,我想获取状态为“King”的重复项,如果存在状态为“King”的重复项,则获取状态为“Queen”的重复项,如果没有状态为“King”或“Queen”的重复项,则获取具有“Queen”的重复项而不是只有一个有“杰克”的 基本上

假设我有一个包含四列的表:FirstName、LastName、Number(不是主键)和Status。如果一个人的名字、姓氏和号码相同,但身份不同(其中身份是一个字符串,如“国王”或“王后”或“杰克”)

我想从表中检索所有列的所有值,但如果存在同名、姓和编号相同的重复项,我想获取状态为“King”的重复项,如果存在状态为“King”的重复项,则获取状态为“Queen”的重复项,如果没有状态为“King”或“Queen”的重复项,则获取具有“Queen”的重复项而不是只有一个有“杰克”的


基本上,优先顺序是国王、王后,然后是杰克。因此,我需要表中的所有值,但如果有重复项,则只包括具有最高优先级的值。我做了一些研究,发现MYSql以外的SQL实现似乎提供了诸如dense_rank之类的功能,但我需要在MYSql中实现这一点,我找不到任何方法。

实现这一点的一种方法是
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
          );

尝试使用会话变量:

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;

更新您的问题添加您正在使用的代码。。一个合适的数据样本你的实际结果和预期结果谢谢你的回复!我得到一个错误,子查询返回超过1行,我试图通过谷歌搜索找到一个解决方案,但我看不出哪里会有问题。我修复了子查询错误,但使用该语句,我没有得到任何返回“Jack”的值,只有“King”和“Queen”。@cjstitles。第一种方法应该仍然有效。