MySQL select查询输出中的标志重复

MySQL select查询输出中的标志重复,mysql,duplicates,Mysql,Duplicates,到目前为止,我的sql查询在表上有几个连接,最终输出如下所示: FLAG id name ---- --- ---- OK 21 ken OK 34 mon OK 51 jil OK 51 jil OK 71 jil OK 80 ron OK 91 ron

到目前为止,我的sql查询在表上有几个连接,最终输出如下所示:

FLAG        id      name
----        ---     ----
OK          21      ken
OK          34      mon
OK          51      jil
OK          51      jil
OK          71      jil
OK          80      ron
OK          91      ron
现在,我希望重复名称的标志显示为最低id的“dup”:

FLAG        id      name
----        ---     ----
OK          21      ken
OK          34      mon
OK          51      jil
dup_51      51      jil
dup_51      71      jil
OK          80      ron
dup_80      91      ron

我可以通过对存储在文件中的记录使用shell/perl脚本来实现这一点,但需要知道是否可以通过操纵我的SQL查询来实现。。感谢您的时间和帮助。

我建议使用子查询跟踪
name
上的重复条目,并返回每个重复条目的最小
id
。我将确定您的表名为
tbl

select name, min(id) as dupId
from tbl
group by name
having count(name) > 1
现在,您可以将其与原始表合并:

select 
    tbl.*, if(not isnull(dupId), 'Ok', concat('dup_', dupId)) as flag2
from 
    tbl
    left join (
        select name, min(id) as dupId
        from tbl
        group by name
        having count(name) > 1) as a on tbl.name = a.name

这是一种方法。希望对您有所帮助。

这不是小事。是否有任何原因需要在sql端而不是在客户端执行此操作?您需要为每一行(即使是重复的行)提供唯一的行ID。然后为id和name的每个唯一组合选择min(rowID),并将该rowID更新为OK,其他所有内容更新为dupei如果要在mysql中执行此操作,请检查用户定义的变量和case语句。谢谢。一、 但是,这是在shell脚本中完成的:逐行处理旧的输出文件,并与上一行进行比较。@Drek well。。无论如何,这是最好的解决方案(就像Mark B评论的那样)。。。但是,如果需要在mysql内部执行此操作,则需要使用一些子查询。很乐意帮忙