mg4377娱乐娱城官网_mg4377娱乐手机版_www.mg4377.com

当前位置: mg4377娱乐娱城官网 > mg > 正文

多表查询去除重复记录,多表查询

时间:2019-06-29 15:50来源:mg
多表查询去除重复记录 SQL重复记录查询 select * from table1 单表的独步天下查询用:distinct 多表的并世无双查询用:group by distinct 查询多表时,left join 还管用,全连接无效, 在使用mysql时

多表查询去除重复记录

SQL重复记录查询

select * from table1

单表的独步天下查询用:distinct
多表的并世无双查询用:group by
distinct 查询多表时,left join 还管用,全连接无效,
在使用mysql时,一时须求查询出某些字段不另行的笔录,尽管mysql提供有distinct那么些根本字来过滤掉多余的重复记录只保留一条,但频仍只用它来回到不重复记录的条数,而不是用它来回到不重复记录的有所值。其缘由是distinct只好回到它的对象字段,而一筹莫展重返别的字段,用distinct不能够减轻的话,我只有用二重循环查询来化解,而那样对于三个数据量十分的大的站以来,无疑是会一贯影响到功能的。
下边先来看看例子: 表的构造如下:
id name
1 a
2 b
3 c
4 c
5 b
着力的表的结构大要上那样,那只是三个粗略的例子,实际的多表查询等等情形会复杂得多。
比如说小编想用一条语句询问获得name不重复的持有数据,那就务须利用distinct去掉多余的重复记录。
select distinct name from table
获取的结果是: name
a

率先关于sql  多表查询去除重复记录大家就可以想到用group by 或distinct 再着想到inner left 等,
上面来看望个实例

1、查找表中多余的重复记录,重复记录是基于单个字段(peopleId)来剖断 

select * from table2

c
看似到达效果了,不过,作者想要获得的是id值呢?改一下查询语句吧:
select distinct name, id from table
结果会是: id name
1 a
2 b
3 c
4 c
5 b
distinct怎么没起功用?功用其实是起了,可是他还要效率了七个字段,也正是必须得id与name都平等的才会被解除。
咱俩再改改查询语句: select id, distinct name from table
很不满,除了错误音信你如何也得不到,distinct必须放在发轫。难到不能够把distinct放到where条件里?试试,照样报错。

多表查询去除重复记录,多表查询。看一个distinct 实例

select * from people 
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 

 

试了半天其余能想到的办法也特别,最后在mysql手册里找到三个用法,用group_concat(distinct name)合营group by name落成了自个儿所急需的意义,喜悦,天佑小编也,快速试试。
报错,郁闷!
连mysql手册也跟自个儿打断,先给了笔者愿意,然后又把本身推进失望。
再精心一查,group_concat函数是4.1支撑,晕,笔者4.0的。不能够,进级,升完级一试,成功。
到头来消除了,也就那样一来,又不能够没有须求客户也晋级了。
突然脑子一闪,既然能够选取group_concat函数,那其余函数能可以吗?
尽早用count函数一试,成功,费了那样多手艺,原本就这么轻易。
mg,将来将一体化语句放出: select *, count(distinct name) from table group by name
结果: id name count(distinct name)
1 a 1
2 b 1
3 c 1
末尾一项是剩下的,不用管就行了,目标达到。
原来mysql这么笨,轻轻一下就把她骗过去了,今后拿出去希望大家不要被那标题折腾。
再顺便说一句,group by 必须放在 order by 和 limit从前,不然会报错。
说一下group by的其实例子:

今昔将完全语句放出:

例二: 

select a.*,b.* from table1 a, table2 b where a.id=b.e

复制代码 代码如下:

select *, count(distinct name) from table group by name

select * from testtable 
where numeber in (select number from people group by number having count(number) > 1 ) 

-- 查询表1 列X有再度的值,则只取一条
select min(id) as id,b,c from table1 group by b,c order by id asc

$sql = 'select DISTINCT n.nid,tn.tid,n.title,n.created,ni.thumbpath from {term_node} tn INNER JOIN {node} n ON n.nid=tn.nid INNER JOIN {node_images} ni ON ni.nid=n.nid where tn.tid IN('.implode(',', $tids).') ORDER BY n.nid DESC';
$res = db_query($sql);
$t_data = array();
while($r = db_fetch_array($res)) {
print_r($r);
}

结果:

能够查出testtable表中number同样的笔录  

 

用这一个查询语句的时候,总会产出多少个同样nid的气象,举例上边包车型的士结果

   id name count(distinct name)
   1 a 1
   2 b 1
   3 c 1

2、删除表中多余的重复记录,重复记录是基于单个字段(peopleId)来判别,只留有rowid最小的记录 

-- 1、查找表中多余的重复记录,重复记录是依靠单个字段(peopleId)来推断
select * from table1 where b in (select  b  from  table1  group  by  b  having  count(b) > 1)

复制代码 代码如下:

最后一项是多余的,不用管就行了,目标达到。。。。。

delete from people  

where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 

and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1) 

-- 1、查找表中未有重复记录的行
select * from table1 where b in (select  b  from  table1  group  by  b  having  count(b) = 1)

Array
(
[created] => 1215331278
[nid] => 1603
[tid] => 32
[title] => 夏天婚典海洋蓝沁饮DIY
[thumbpath] => files/node_images/home-77.1_tn.jpg
)
Array
(
[created] => 1215331278
[nid] => 1603
[tid] => 32
[title] => 夏季婚典淡蓝沁饮DIY
[thumbpath] => files/node_images/003_primary_tn.jpg
)

group by 必须放在 order by 和 limit从前,不然会报错

3、查找表中多余的重复记录(多个字段)  

 

上边用了DISTINCT也不论用,其实是平价了,但是本身想询问结构里nid是唯一的。
最终用了group by

db_a:
id    age
1      20
2       30
3      40
4       50
db_b:
topid      poto
  2           axxxxxxxxxx
  2           bxxxxxxxxxx
  2           cxxxxxxxxxxx
  3           dxxxxxxxxxxx

select * from vitae a 
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) 

 

复制代码 代码如下:

SELECT * FROM db_a AS A LEFT JOIN db_b AS B ON B.topid=A.id;

4、删除表中多余的重复记录(三个字段),只留有rowid最小的记录 

select a.*,b.id,b.e from table1 a inner join (select min(id) as id,e from table2 group by e) b on a.id=b.e

$sql = 'select
n.nid,tn.tid,n.title,n.created,ni.thumbpath from {term_node} tn INNER
JOIN {node} n ON n.nid=tn.nid INNER JOIN {node_images} ni ON
ni.nid=n.nid where tn.tid IN('.implode(',', $tids).') GROUP BY
n.nid DESC';
$res = db_query($sql);
$t_data = array();
while($r = db_fetch_array($res)) {
print_r($r);
}

编辑:mg 本文来源:多表查询去除重复记录,多表查询

关键词: