码迷,mamicode.com
首页 > 数据库 > 详细

mysql 查询

时间:2019-09-08 00:19:30      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:创建   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 

注意:Mysql5.7及以上版本group by 子查询中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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mysql 查询

标签:创建   mysq   子查询   pre   去重   order   不重复   str   字段   

原文地址:https://www.cnblogs.com/dw3306/p/11483932.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!