解析mysql中:单表distinct、多表groupby查询去除重复记录

更新时间:2023-07-11 20:21:23 阅读: 评论:0

解析mysql中:单表distinct、多表groupby查询去除重复记录
单表的唯⼀查询⽤: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去掉多余的重复记录。
lect distinct name from table
得到的结果是:
name
a
b
c
对标管理好像达到效果了,可是,我想要得到的是id值呢?改⼀下查询语句吧:
lect distinct name, id from table
结果会是:
id name
1 a
2 b
3 c
去笔画顺序4 c
5 b
distinct怎么没起作⽤?作⽤其实是起了,不过他同时作⽤了两个字段,也就是必须得id与name都相同的才会被排除。
我们再改改查询语句:
lect id, distinct name from table
很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件⾥?试试,照样报错。
试了半天其他能想到的⽅法也不⾏,最后在mysql⼿册⾥找到⼀个⽤法,⽤group_concat(distinct name)配合group by name实现了我所需要的功能,兴奋,天佑我也,赶快试
试。
报错,郁闷!
连mysql⼿册也跟我过不去,先给了我希望,然后⼜把我推向失望。
再仔细⼀查,group_concat函数是4.1⽀持,晕,我4.0的。没办法,升级,升完级⼀试,成功。
终于搞定了,不过这样⼀来,⼜必须要求客户也升级了。
突然灵机⼀闪,既然可以使⽤group_concat函数,那其它函数能⾏吗?
赶紧⽤count函数⼀试,成功,费了这么多⼯夫,原来就这么简单。
现在将完整语句放出:
lect *, 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的实际例⼦:
$sql ='lect 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 ='lect
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);
}
我就得到了nid是唯⼀的。

本文发布于:2023-07-11 20:21:23,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1077487.html

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

标签:查询   重复记录   语句   返回
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图