MySQL select查询输出中的标志重复
到目前为止,我的sql查询在表上有几个连接,最终输出如下所示: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
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内部执行此操作,则需要使用一些子查询。很乐意帮忙