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