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`;