解析mysql中:单表distinct、多表groupby查询去除重复记录
单表的唯⼀查询⽤:distinct
多表的唯⼀查询⽤:group by
distinct 查询多表时,left join 还有效,全连接⽆效,
在使⽤mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留⼀条,但往往只⽤它来返回不重复记录的条数,⽽
不是⽤它来返回不重复记录的所有值。其原因是distinct只能返回它的⽬标字段,⽽⽆法返回其它字段,⽤distinct不能解决的话,我只有⽤⼆重循环查询来解决,⽽这样对于⼀个
数据量⾮常⼤的站来说,⽆疑是会直接影响到效率的。
下⾯先来看看例⼦:
表的结构如下:
id name
javascript手册中文版pdf1 a
2 b
3 c
4 c
5 b
基本的表的结构⼤概这样,这只是⼀个简单的例⼦,实际的多表查询等等情况会复杂得多。
⽐如我想⽤⼀条语句查询得到name不重复的所有数据,那就必须使⽤distinct去掉多余的重复记录。
select distinct name from table
得到的结果是:
name
a
b
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条件⾥?试试,照样报错。
试了半天其他能想到的⽅法也不⾏,最后在mysql⼿册⾥到⼀个⽤法,⽤group_concat(distinct name)配合group by name实现了我所需要的功能,兴奋,天佑我也,赶快试
试。
报错,郁闷!
连mysql⼿册也跟我过不去,先给了我希望,然后⼜把我推向失望。
java编程培训学院再仔细⼀查,group_concat函数是4.1⽀持,晕,我4.0的。没办法,升级,升完级⼀试,成功。
终于搞定了,不过这样⼀来,⼜必须要求客户也升级了。
突然灵机⼀闪,既然可以使⽤group_concat函数,那其它函数能⾏吗?
赶紧⽤count函数⼀试,成功,费了这么多⼯夫,原来就这么简单。
现在将完整语句放出:
select *, count(distinct name) from table group by name
结果:
id name count(distinct name)
cssfloat样式1 a 1
2 b 1
3 c 1
最后⼀项是多余的,不⽤管就⾏了,⽬的达到。
原来mysql这么笨,轻轻⼀下就把他骗过去了,现在拿出来希望⼤家不要被这问题折腾。
再顺便说⼀句,group by 必须放在 order by 和 limit之前,不然会报错。
js去重for
说⼀下group by的实际例⼦:
$sql ='select DISTINCT n.nid,tn.tid,n.ated,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);
}
⽤这个查询语句的时候,总会出现两个相同nid的情况,⽐如下⾯的结果
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
)
上⾯⽤了DISTINCT也不管⽤,其实是管⽤了,但是我想查询结构⾥nid是唯⼀的。
最后⽤了group by
$sql ='select
n.nid,tn.tid,n.ated,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);
}
mysql语句多表查询我就得到了nid是唯⼀的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。