mysql - MySQL删除重复数据的方法

标签 mysql sql greatest-n-per-group mysql-8.0

我有这样的表用户

UserID   | UserName | UserEmail       | FlagUser
1        | Penny    | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7d0d181313043d1a101c1411531e1210" rel="noreferrer noopener nofollow">[email protected]</a> | A1
2        | Maika    | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="dbb6bab2b0ba9bbcb6bab2b7f5b8b4b6" rel="noreferrer noopener nofollow">[email protected]</a> | A1
3        | Laila    | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7f131e16131e3f18121e1613511c1012" rel="noreferrer noopener nofollow">[email protected]</a> | A1
4        | Laura    | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d5b9b4a0a7b495b2b8b4bcb9fbb6bab8" rel="noreferrer noopener nofollow">[email protected]</a> | A2
5        | Penny    | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4131242f2f3801262c20282d6f222e2c" rel="noreferrer noopener nofollow">[email protected]</a> | A2
6        | Maika    | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="90fdf1f9fbf1d0f7fdf1f9fcbef3fffd" rel="noreferrer noopener nofollow">[email protected]</a> | A2

我想要这样的结果,如果用户有多个数据,我希望使用 FlagUser A2 获取用户

UserID   | UserName | UserEmail       | FlagUser
3        | Laila    | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="98f4f9f1f4f9d8fff5f9f1f4b6fbf7f5" rel="noreferrer noopener nofollow">[email protected]</a> | A1
4        | Laura    | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c4a8a5b1b6a584a3a9a5ada8eaa7aba9" rel="noreferrer noopener nofollow">[email protected]</a> | A2
5        | Penny    | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7505101b1b0c351218141c195b161a18" rel="noreferrer noopener nofollow">[email protected]</a> | A2
6        | Maika    | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a9c4c8c0c2c8e9cec4c8c0c587cac6c4" rel="noreferrer noopener nofollow">[email protected]</a> | A2

最佳答案

如果您使用的是 mysql 8.0 那么 row_number() WITH Common table expression是方便的方法:

架构:

 create table user(UserID int, UserName varchar(50), UserEmail varchar(50), FlagUser varchar(50));
 insert into user values(1,        'Penny'    , '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cdbda8a3a3b48daaa0aca4a1e3aea2a0" rel="noreferrer noopener nofollow">[email protected]</a>'  ,'A1');
 insert into user values(2,        'Maika'    , '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2e434f47454f6e49434f4742004d4143" rel="noreferrer noopener nofollow">[email protected]</a>'  ,'A1');
 insert into user values(3,        'Laila'    , '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a2cec3cbcec3e2c5cfc3cbce8cc1cdcf" rel="noreferrer noopener nofollow">[email protected]</a>'  ,'A1');
 insert into user values(4,        'Laura'    , '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1a767b6f687b5a7d777b737634797577" rel="noreferrer noopener nofollow">[email protected]</a>'  ,'A2');
 insert into user values(5,        'Penny'    , '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="bcccd9d2d2c5fcdbd1ddd5d092dfd3d1" rel="noreferrer noopener nofollow">[email protected]</a>'  ,'A2');
 insert into user values(6,        'Maika'    , '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="204d41494b4160474d41494c0e434f4d" rel="noreferrer noopener nofollow">[email protected]</a>'  ,'A2');

查询

 with cte as
 (
     select *,row_number()over(partition by username order by flaguser desc) rn
     from user
 )
 select * from cte where rn=1

输出:

<表类=“s-表”> <标题> 用户ID 用户名 用户电子邮件 FlagUser rn <正文> 3 莱拉 [email protected] A1 1 4 劳拉 [email protected] A2 1 6 麦卡 [email protected] A2 1 5 佩妮 [email protected] A2 1

db<> fiddle here

您也可以使用 Inner join 获得相同的结果和group by子句:

 select u.* from user u
 inner join
 (select username,max(flaguser) maxflaguser from user
 group by username) u2
 on u.username=u2.username and u.flaguser=u2.maxflaguser

输出:

<表类=“s-表”> <标题> 用户ID 用户名 用户电子邮件 FlagUser <正文> 3 莱拉 [email protected] A1 4 劳拉 [email protected] A2 5 佩妮 [email protected] A2 6 麦卡 [email protected] A2

或者您可以使用子查询为每个用户选择具有最高值 flaguser 的单行:

 Select * from user u
 where flaguser=(select max(flaguser) from user u2 where u.username=u2.username)

输出:

<表类=“s-表”> <标题> 用户ID 用户名 用户电子邮件 FlagUser <正文> 3 莱拉 [email protected] A1 4 劳拉 [email protected] A2 5 佩妮 [email protected] A2 6 麦卡 [email protected] A2

db<> fiddle here

关于mysql - MySQL删除重复数据的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66902000/

相关文章:

mysql - 检索每组中的最后一条记录 - MySQL

php - 选择所有最新关系为真的地方?

java.sql.SQLException : Parameter index out of range (1 > number of parameters, 这是 0) 错误

java - 如何从 Java 在 cmd 命令中输入

Mysql根据同一张表中的多行选择行

sql - 如何选择没有间隔的日期间隔?

Mysql - 从表 B 引用时需要获取表 A 的最新信息

MySQL 布局需要验证

php - 为什么背景图像:url() replace slash bar on url?

sql - 使用可选的存储过程参数