请教高手!!关于使用distinct在mysql中查询多条不重复记录值的解决办法!!~~(急!!!)

时间:2021-04-18 00:49:49
在使用mysql时,需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但distinct只能返回它的目标字段,而无法返回其它字段,请问各位高手这个问题怎么处理啊????十分感谢!!!
如:
  table:
  id   name
  1    a
  2    b
  3    c
  4    c
  5    b
  比如我想用一条语句查询得到name不重复的所有数据,使用distinct去掉多余的重复记录。

   select distinct name from table
   
   得到的结果是:

  name
  a
  b
  c

但同时我还想要得到id值,请问那该怎么办???!!!

12 个解决方案

#1


SELECT id, name FROM [TABLE] a WHERE (id IN (SELECT MIN(b.id) FROM [TABLE] b WHERE b.name = a.name))

#2


不好意思,可能是我举的例子有问题。假如是这样的表
table:
  nj      kemu    name
一年级    语文   如何做好考试
一年级    语文   士大夫士大夫
二年级    语文   是士大夫是
三年级    数学   似的似的
四年级    数学   似的是反对是的
一年级    语文   士大夫士大夫
四年级    数学   亿毫日分亿克

我想要的结果是:
一年级    语文   如何做好考试
二年级    语文   是士大夫是
三年级    数学   似的似的
四年级    数学   似的是反对是的

请问这样应该怎么办呢???十分感谢!!!!

#3



select * from tb where not exists(select 1 from tb t2 where name=tb.name and id>t2.id)

#4


declare @t table(id int,name varchar(2))
insert into @t select 1,'a'
union all select 2,'b'
union all select 3,'c'
union all select 4,'c'
union all select 5,'b'

select * 
from @t tb 
where not exists(select 1 from @t  t2 where name=tb.name and id>tb.id)

/*
id          name 
----------- ---- 
1           a
4           c
5           b

(所影响的行数为 3 行)
*/
*/

#5


来个简单的
select a.nj,a.kemu,a.name
from table1 a,
(select b.nj tnj,b.kemu tkemu from table1 b group by b.nj,b.kemu) t
where a.nj=t.tnj and a.kemu=t.tkemu

#6


declare @t table(nj varchar(10),kemu varchar(10),name varchar(20))
insert into @t select  '一年级'  ,  '语文'   ,'如何做好考试'
union all select '一年级' ,   '语文'   ,'士大夫士大夫'
union all select'二年级'   , '语文',   '是士大夫是'
union all select
'三年级'  ,  '数学' , ' 似的似的'
union all select
'四年级'  , ' 数学' ,  '似的是反对是的'
union all select
'一年级' ,   '语文',  ' 士大夫士大夫'
union all select
'四年级'  ,  '数学'  , '亿毫日分亿克'


select *
 from @t tb
 where  exists(select distinct  * from @t tb)

#7


我的方法不可用

#8


declare @t table(nj varchar(10),kemu varchar(10),name varchar(20))
insert into @t select  '一年级'  ,  '语文'   ,'如何做好考试'
union all select '一年级' ,   '语文'   ,'士大夫士大夫'
union all select'二年级'   , '语文',   '是士大夫是'
union all select
'三年级'  ,  '数学' , ' 似的似的'
union all select
'四年级'  , ' 数学' ,  '似的是反对是的'
union all select
'一年级' ,   '语文',  '士大夫士大夫'
union all select
'四年级'  ,  '数学'  , '亿毫日分亿克'

select distinct  * from @t tb 
/*
nj         kemu       name                 
---------- ---------- -------------------- 
二年级        语文         是士大夫是
三年级        数学          似的似的
四年级         数学        似的是反对是的
四年级        数学         亿毫日分亿克
一年级        语文         如何做好考试
一年级        语文         士大夫士大夫

(所影响的行数为 6 行)


*/
这样直接不重复?

#9


有点迷糊,以上各位高手的方法我都一一试过了,可是好象都不可以啊,麻烦各位再帮忙想一想!!谢谢啦~!~~~

#10


alter table t add id int identity(1,1)
select min(id)id ,nj from t group by nj 

select * from t where id in (select min(id)id  from t group by nj) 
alter table t drop column id

#11


此表结构设计错误,理论上讲没人写的出来,为什么呢?因为你的表里没有唯一ID,而数据库里是没有顺序ID的,即使写出来了,过段时间数据库中的记录增大了,sql的执行结果就不对了!

例:
一年级    语文   如何做好考试
一年级    语文   士大夫士大夫
二年级    语文   是士大夫是
三年级    数学   似的似的
四年级    数学   似的是反对是的
一年级    语文   士大夫士大夫
四年级    数学   亿毫日分亿克

说明:
select top 1 年级 form 表名 where 年级="一年级"
出的结果未必永远都是“一年级    语文   如何做好考试”,因为表以后增大了,出的结果可能就是其它的了。

你应该把表设计成这样(增加oid字段,为递增步长为1的主键索引)
oid 年级      科目   内容
1    一年级    语文   如何做好考试
2    一年级    语文   士大夫士大夫
3    二年级    语文   是士大夫是
4    三年级    数学   似的似的
5    四年级    数学   似的是反对是的
6    一年级    语文   士大夫士大夫
7    四年级    数学   亿毫日分亿克

select * from 表名 where oid in (select top 1 oid from 表名 group by 年级)

#12


我的问题能够解决要谢谢以上各位高手的帮忙,谢谢!!

#1


SELECT id, name FROM [TABLE] a WHERE (id IN (SELECT MIN(b.id) FROM [TABLE] b WHERE b.name = a.name))

#2


不好意思,可能是我举的例子有问题。假如是这样的表
table:
  nj      kemu    name
一年级    语文   如何做好考试
一年级    语文   士大夫士大夫
二年级    语文   是士大夫是
三年级    数学   似的似的
四年级    数学   似的是反对是的
一年级    语文   士大夫士大夫
四年级    数学   亿毫日分亿克

我想要的结果是:
一年级    语文   如何做好考试
二年级    语文   是士大夫是
三年级    数学   似的似的
四年级    数学   似的是反对是的

请问这样应该怎么办呢???十分感谢!!!!

#3



select * from tb where not exists(select 1 from tb t2 where name=tb.name and id>t2.id)

#4


declare @t table(id int,name varchar(2))
insert into @t select 1,'a'
union all select 2,'b'
union all select 3,'c'
union all select 4,'c'
union all select 5,'b'

select * 
from @t tb 
where not exists(select 1 from @t  t2 where name=tb.name and id>tb.id)

/*
id          name 
----------- ---- 
1           a
4           c
5           b

(所影响的行数为 3 行)
*/
*/

#5


来个简单的
select a.nj,a.kemu,a.name
from table1 a,
(select b.nj tnj,b.kemu tkemu from table1 b group by b.nj,b.kemu) t
where a.nj=t.tnj and a.kemu=t.tkemu

#6


declare @t table(nj varchar(10),kemu varchar(10),name varchar(20))
insert into @t select  '一年级'  ,  '语文'   ,'如何做好考试'
union all select '一年级' ,   '语文'   ,'士大夫士大夫'
union all select'二年级'   , '语文',   '是士大夫是'
union all select
'三年级'  ,  '数学' , ' 似的似的'
union all select
'四年级'  , ' 数学' ,  '似的是反对是的'
union all select
'一年级' ,   '语文',  ' 士大夫士大夫'
union all select
'四年级'  ,  '数学'  , '亿毫日分亿克'


select *
 from @t tb
 where  exists(select distinct  * from @t tb)

#7


我的方法不可用

#8


declare @t table(nj varchar(10),kemu varchar(10),name varchar(20))
insert into @t select  '一年级'  ,  '语文'   ,'如何做好考试'
union all select '一年级' ,   '语文'   ,'士大夫士大夫'
union all select'二年级'   , '语文',   '是士大夫是'
union all select
'三年级'  ,  '数学' , ' 似的似的'
union all select
'四年级'  , ' 数学' ,  '似的是反对是的'
union all select
'一年级' ,   '语文',  '士大夫士大夫'
union all select
'四年级'  ,  '数学'  , '亿毫日分亿克'

select distinct  * from @t tb 
/*
nj         kemu       name                 
---------- ---------- -------------------- 
二年级        语文         是士大夫是
三年级        数学          似的似的
四年级         数学        似的是反对是的
四年级        数学         亿毫日分亿克
一年级        语文         如何做好考试
一年级        语文         士大夫士大夫

(所影响的行数为 6 行)


*/
这样直接不重复?

#9


有点迷糊,以上各位高手的方法我都一一试过了,可是好象都不可以啊,麻烦各位再帮忙想一想!!谢谢啦~!~~~

#10


alter table t add id int identity(1,1)
select min(id)id ,nj from t group by nj 

select * from t where id in (select min(id)id  from t group by nj) 
alter table t drop column id

#11


此表结构设计错误,理论上讲没人写的出来,为什么呢?因为你的表里没有唯一ID,而数据库里是没有顺序ID的,即使写出来了,过段时间数据库中的记录增大了,sql的执行结果就不对了!

例:
一年级    语文   如何做好考试
一年级    语文   士大夫士大夫
二年级    语文   是士大夫是
三年级    数学   似的似的
四年级    数学   似的是反对是的
一年级    语文   士大夫士大夫
四年级    数学   亿毫日分亿克

说明:
select top 1 年级 form 表名 where 年级="一年级"
出的结果未必永远都是“一年级    语文   如何做好考试”,因为表以后增大了,出的结果可能就是其它的了。

你应该把表设计成这样(增加oid字段,为递增步长为1的主键索引)
oid 年级      科目   内容
1    一年级    语文   如何做好考试
2    一年级    语文   士大夫士大夫
3    二年级    语文   是士大夫是
4    三年级    数学   似的似的
5    四年级    数学   似的是反对是的
6    一年级    语文   士大夫士大夫
7    四年级    数学   亿毫日分亿克

select * from 表名 where oid in (select top 1 oid from 表名 group by 年级)

#12


我的问题能够解决要谢谢以上各位高手的帮忙,谢谢!!