Return 值基于重复的列
Return value based on duplicate columns
Table:
firstname | lastname | age
Joey | Sanchez | 33
Joey | Sanchez | 33
Rachel | Dudok | 28
我正在尝试做一个 MySQL select 声明,当 2列重复
我尝试了 Case 语句,但它最终只返回了 1 行。
SELECT
Firstname,
Lastname,
CASE
WHEN count(firstname) AND count(lastname) AND count(age) >= 2
THEN '**ERROR**'
ELSE age
END
FROM Table;
你可以试试 group by
:
select Firstname
, Lastname
, case when count(*) > 1 then '**ERROR**' else age end
from Table
group by Firstname
, Lastname
, age;
或者,如果您想要 return 所有重复的行:
select t.Firstname
, t.Lastname
, case when (select count(*)
from Table
where Firstname = t.Firstname and
Lastname = t.Lastname and
age = t.age) > 1 then '**ERROR**' else age
end
from Table t
有很多方法可以处理重复记录。在大多数情况下,最好的方法可能是完全使用 UNIQUE 键来阻止它们:
ALTER TABLE `mytable` ADD UNIQUE INDEX (`firstname`,`lastname`,`age`);
但是,由于您已经有重复项并且需要找到它们,那是以后的事。对于您的特定要求,这里有一种处理方法:
SELECT s.`firstname`,s.`lastname`,IF(c.rc > 1,'ERROR',s.`age`) AS 'age'
FROM `myTable` AS s
JOIN (SELECT `firstname`, `lastname`, `age`, count(*) AS rc
FROM `myTable`
GROUP BY `firstname`,`lastname`,`age`)
AS c ON c.`firstname` = s.`firstname`
AND c.`lastname` = s.`lastname`
AND c.`age` = s.`age`;
如果每个 name/age 组合只想接收 1 行,请将 DISTINCT 添加到外部查询:
SELECT DISTINCT s.`firstname`,s.`lastname`,IF(c.rc > 1,'ERROR',s.`age`) AS 'age'
FROM `myTable` AS s
JOIN (SELECT `firstname`, `lastname`, `age`, count(*) AS rc
FROM `myTable`
GROUP BY `firstname`,`lastname`,`age`)
AS c ON c.`firstname` = s.`firstname`
AND c.`lastname` = s.`lastname`
AND c.`age` = s.`age`;
Table:
firstname | lastname | age
Joey | Sanchez | 33
Joey | Sanchez | 33
Rachel | Dudok | 28
我正在尝试做一个 MySQL select 声明,当 2列重复
我尝试了 Case 语句,但它最终只返回了 1 行。
SELECT
Firstname,
Lastname,
CASE
WHEN count(firstname) AND count(lastname) AND count(age) >= 2
THEN '**ERROR**'
ELSE age
END
FROM Table;
你可以试试 group by
:
select Firstname
, Lastname
, case when count(*) > 1 then '**ERROR**' else age end
from Table
group by Firstname
, Lastname
, age;
或者,如果您想要 return 所有重复的行:
select t.Firstname
, t.Lastname
, case when (select count(*)
from Table
where Firstname = t.Firstname and
Lastname = t.Lastname and
age = t.age) > 1 then '**ERROR**' else age
end
from Table t
有很多方法可以处理重复记录。在大多数情况下,最好的方法可能是完全使用 UNIQUE 键来阻止它们:
ALTER TABLE `mytable` ADD UNIQUE INDEX (`firstname`,`lastname`,`age`);
但是,由于您已经有重复项并且需要找到它们,那是以后的事。对于您的特定要求,这里有一种处理方法:
SELECT s.`firstname`,s.`lastname`,IF(c.rc > 1,'ERROR',s.`age`) AS 'age'
FROM `myTable` AS s
JOIN (SELECT `firstname`, `lastname`, `age`, count(*) AS rc
FROM `myTable`
GROUP BY `firstname`,`lastname`,`age`)
AS c ON c.`firstname` = s.`firstname`
AND c.`lastname` = s.`lastname`
AND c.`age` = s.`age`;
如果每个 name/age 组合只想接收 1 行,请将 DISTINCT 添加到外部查询:
SELECT DISTINCT s.`firstname`,s.`lastname`,IF(c.rc > 1,'ERROR',s.`age`) AS 'age'
FROM `myTable` AS s
JOIN (SELECT `firstname`, `lastname`, `age`, count(*) AS rc
FROM `myTable`
GROUP BY `firstname`,`lastname`,`age`)
AS c ON c.`firstname` = s.`firstname`
AND c.`lastname` = s.`lastname`
AND c.`age` = s.`age`;