标签:创建 mysq 子查询 pre 去重 order 不重复 str 字段
mysql 查询
1: Distinct
有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能去重他的目标字段(即所有查询的字段)
注意: distinct必须放在要查询字段的开头
eg:
1:select distinct user_name from xxx 这样会过滤掉user_name 重复的,
2:如果这样写: select distinct id, user_name, password from xxx mysql会认为要过滤掉 id、user_name 、 password 都重复(完全一样)的,不然只要有一个字段不一样都会被查询出来;
注意:如果查询的有时间字段只有当时间的年月日时分秒都重复时才会被过滤掉
所以一般distinct用来查询不重复记录的条数。
如果要查询不重复的记录,有时候可以用group by
2:order by
如何解决?
1: 通过limit 语句使子查询的order by生效
但是这必须保证limit的数量,所以也可以使用DISTINCT实现。
3: group by
注意:使用group by 后默认返回的是每个组中id 最小的那一条记录
问题1: 对于mysql中的group by分组后如何获取组内创建时间最大(或最小)的那行数据 ?
以最大为例:
思路: 先对要查询的数据先进行降序排序,然后在使用group by 即可,但是会使用到子查询先排序(这里需要注意上面说到的order by)
SELECT * FROM( SELECT DISTINCT * FROM a ORDER BY a.start_time DESC ) AS b GROUP BY b.id
问题2:对一个结果集分组后怎么取每个分组的两条(或多条)最大(或最小)的数据?
取最大的两条:
SELECT * FROM student_score AS a WHERE ( SELECT COUNT(*) FROM student_score AS b WHERE a.student_name=b.student_name AND a.score<b.score )<2 ORDER BY a.score DESC
取最小的两条:
SELECT * FROM student_score AS a WHERE ( SELECT COUNT(*) FROM student_score AS b WHERE a.student_name=b.student_name AND a.score>b.score )<2 ORDER BY a.score DESC
标签:创建 mysq 子查询 pre 去重 order 不重复 str 字段
原文地址:https://www.cnblogs.com/dw3306/p/11483932.html