MYSQL过滤表中某几个字段重复的数据

MYSQL过滤表中某几个字段重复的数据,第1张

场景:表中包含有group_id,worker_id,status字段,查询这三个字段是否存在重复的数据。

查找某个人在某个班组内存在多个status为0的数据

查找某个人在某个班组内存在多个status为0的数据,将最小的id选出来

查找某个人在某个班组内存在多个status为0的数据,将最小的id选出来,并设置status为1

将查询查询结果作为where in的条件,需要select的结果再通过一个中间表select多一次,否则会报You can't specify target table for update in FROM clause。

在使用 MySQL 时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段,例如有如下表user:

用distinct来返回不重复的用户名:select distinct name from user,结果为:

这样只把不重复的用户名查询出来了,但是用户的id,并没有被查询出来:select distinct name,id from user,这样的结果为:

distinct name,id 这样的mysql 会认为要过滤掉name和id两个字段都重复的记录,如果sql这样写:select id,distinct name from user,这样mysql会报错,因为distinct必须放在要查询字段的开头。

所以一般distinct用来查询不重复记录的条数。

如果要查询不重复的记录,有时候可以用group by :

select id,name from user group by name

select

distinct可以去掉重复记录。

disctinct将重复的记录忽略,但它忽略的是完全一致的重复记录,而不是其中某个字段重复的记录,或者说,distinct查询一个字段时好使,多个字段就不好使。

所以用聚合函数和group

by实现

注意:group

by只能跟聚合函数搭配使用

例表

ID

username

password

TRDESC

1

A

abcdef

QR

2

A

abcdef

W34

3

A

bbbbbb

AD

4

B

aaaaaa

asdf

查询username和password组合起来的条件不能重复的查询结果(这个都能重复,不能不说这是个烂摊子)

select

*

from

mytable

where

ID

in(select

max(ID)

from

mytable

group

by

username,password)

当username和password重复时,取ID最小的记录:

select

*

from

mytable

where

ID

in(select

min(ID)

from

mytable

a

group

by

username,password)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8501909.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-17
下一篇 2023-04-17

发表评论

登录后才能评论

评论列表(0条)

保存