重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

mysql怎么查看分组,mysql数据库分组查询语句

mysql 查询排序分组问题

这里想要实现的是的查询不通works_id里面sort最小的老师记录

在社旗等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站设计、做网站 网站设计制作按需定制,公司网站建设,企业网站建设,品牌网站设计,成都营销网站建设,成都外贸网站建设公司,社旗网站建设费用合理。

首先需要做的是sort排序,之后再按照works_id分组解决问题

之前陷入了思维困局,总是想要用min(sort)这种方式去查询,换了思路

复杂的问题需要简单的去做不能说一下子就要搞一个复杂的问题,一个个简单的sql完成复杂的问题

如下:

SELECT aaa.teacher_id AS teacher_id, aaa.works_id FROM ( SELECT * FROM works_teacher ORDER BY sort ) aaa GROUP BY works_id

Mysql 分组查询group by与with rollup

当用select*from 表名 group by ‘字段名1’ 将选出来的内容将按照字段1分组,其他列不尽相同,会以最前面的内容显示:

GROUP BY 后面可以跟多个列名,表示以多列作为分组依据:

mysql select `name`,`date`,count(*) from `employee_tbl` group by `name`,date;

+------+---------------------+----------+

| name | date                | count(*) |

+------+---------------------+----------+

| 小丽 | 2016-04-19 15:26:02 |        1 |

| 小明 | 2016-04-04 15:26:54 |        1 |

| 小明 | 2016-04-11 15:26:40 |        1 |

| 小明 | 2016-04-22 15:25:33 |        1 |

| 小王 | 2016-04-07 15:26:14 |        1 |

| 小王 | 2016-04-20 15:25:47 |        1 |

+------+---------------------+----------+

6 rows in set (0.05 sec)

group by 后可以跟with  rollup,表示在进行分组统计的基础上再次进行汇总统计(在每个分组下都会有统计汇总):

mysql select*from r;

+------+-----+------+

| name | cat | fish |

+------+-----+------+

| 小明 | x  | 1    |

| 小明 | x  | 2    |

| 小明 | x  | 4    |

| 小明 | y  | 2    |

| 小明 | y  | 2    |

| 小明 | z  | 1    |

| 小红 | x  | 1    |

| 小红 | x  | 3    |

| 小红 | y  | 1    |

| 小红 | y  | 2    |

| 小青 | y  | 3    |

| 小青 | z  | 2    |

| 小青 | z  | 1    |

+------+-----+------+

13 rows in set (0.05 sec)

mysql select name,cat,fish,count(*) from r group by name with rollup;

+------+-----+------+----------+

| name | cat | fish | count(*) |

+------+-----+------+----------+

| 小红 | x  | 1    |        4 |

| 小明 | x  | 1    |        6 |

| 小青 | y  | 3    |        3 |

| NULL | y  | 3    |      13 |

+------+-----+------+----------+

4 rows in set (0.05 sec)

mysql select name,cat,fish,count(*) from r group by name,cat with rollup;

+------+------+------+----------+

| name | cat  | fish | count(*) |

+------+------+------+----------+

| 小红 | x    | 1    |        2 |

| 小红 | y    | 1    |        2 |

| 小红 | NULL | 1    |        4 |

| 小明 | x    | 1    |        3 |

| 小明 | y    | 2    |        2 |

| 小明 | z    | 1    |        1 |

| 小明 | NULL | 1    |        6 |

| 小青 | y    | 3    |        1 |

| 小青 | z    | 2    |        2 |

| 小青 | NULL | 2    |        3 |

| NULL | NULL | 2    |      13 |

+------+------+------+----------+

11 rows in set (0.06 sec)

mysql select name,cat,fish,count(*) from r group by name,cat,fish with rollup;

+------+------+------+----------+

| name | cat  | fish | count(*) |

+------+------+------+----------+

| 小红 | x    | 1    |        1 |

| 小红 | x    | 3    |        1 |

| 小红 | x    | NULL |        2 |

| 小红 | y    | 1    |        1 |

| 小红 | y    | 2    |        1 |

| 小红 | y    | NULL |        2 |

| 小红 | NULL | NULL |        4 |

| 小明 | x    | 1    |        1 |

| 小明 | x    | 2    |        1 |

| 小明 | x    | 4    |        1 |

| 小明 | x    | NULL |        3 |

| 小明 | y    | 2    |        2 |

| 小明 | y    | NULL |        2 |

| 小明 | z    | 1    |        1 |

| 小明 | z    | NULL |        1 |

| 小明 | NULL | NULL |        6 |

| 小青 | y    | 3    |        1 |

| 小青 | y    | NULL |        1 |

| 小青 | z    | 1    |        1 |

| 小青 | z    | 2    |        1 |

| 小青 | z    | NULL |        2 |

| 小青 | NULL | NULL |        3 |

| NULL | NULL | NULL |      13 |

+------+------+------+----------+

23 rows in set (0.07 sec)

mysql select name,cat,fish,sum(fish) from r group by name with rollup;

+------+-----+------+-----------+

| name | cat | fish | sum(fish) |

+------+-----+------+-----------+

| 小红 | x  | 1    |        7 |

| 小明 | x  | 1    |        12 |

| 小青 | y  | 3    |        6 |

| NULL | y  | 3    |        25 |

+------+-----+------+-----------+

4 rows in set (0.05 sec)

mysql select name,cat,fish,sum(fish) from r group by name,cat with rollup;

+------+------+------+-----------+

| name | cat  | fish | sum(fish) |

+------+------+------+-----------+

| 小红 | x    | 1    |        4 |

| 小红 | y    | 1    |        3 |

| 小红 | NULL | 1    |        7 |

| 小明 | x    | 1    |        7 |

| 小明 | y    | 2    |        4 |

| 小明 | z    | 1    |        1 |

| 小明 | NULL | 1    |        12 |

| 小青 | y    | 3    |        3 |

| 小青 | z    | 2    |        3 |

| 小青 | NULL | 2    |        6 |

| NULL | NULL | 2    |        25 |

+------+------+------+-----------+

11 rows in set (0.06 sec)

mysql select name,cat,fish,sum(fish) from r group by name,cat,fish with rollup;

+------+------+------+-----------+

| name | cat  | fish | sum(fish) |

+------+------+------+-----------+

| 小红 | x    | 1    |        1 |

| 小红 | x    | 3    |        3 |

| 小红 | x    | NULL |        4 |

| 小红 | y    | 1    |        1 |

| 小红 | y    | 2    |        2 |

| 小红 | y    | NULL |        3 |

| 小红 | NULL | NULL |        7 |

| 小明 | x    | 1    |        1 |

| 小明 | x    | 2    |        2 |

| 小明 | x    | 4    |        4 |

| 小明 | x    | NULL |        7 |

| 小明 | y    | 2    |        4 |

| 小明 | y    | NULL |        4 |

| 小明 | z    | 1    |        1 |

| 小明 | z    | NULL |        1 |

| 小明 | NULL | NULL |        12 |

| 小青 | y    | 3    |        3 |

| 小青 | y    | NULL |        3 |

| 小青 | z    | 1    |        1 |

| 小青 | z    | 2    |        2 |

| 小青 | z    | NULL |        3 |

| 小青 | NULL | NULL |        6 |

| NULL | NULL | NULL |        25 |

+------+------+------+-----------+

23 rows in set (0.07 sec)

————————————————

【MySQL】分组查询(GROUP BY)

MySQL中使用 GROUP BY 对数据进行分组,GROUP BY从字面意义上理解就是根据'BY'指定的规则对数据进行分组, 所谓分组就是将一个'数据集'划分成若干个'子区域',然后针对若干个'小区域'进行数据处理 。基本语法形式为:

字段值为进行分组时所依据的列名称, “HAVING 条件表达式” 指定满足表达式限定条件的结果将被显示。

GROUP BY关键字通常和集合函数一起使用,例如:MAX()、MIN()、COUNT()、SUM()、AVG()。即把数据分为多个逻辑组,并对每个组进行集合计算。

WHERE 子句过滤行,在数据分组前过滤;HAVING 子句过滤分组,在数据分组后过滤。WHERE排除的行不包括在分组里,且HAVING支持所有WHERE操作符。

使用GROUP BY可以对多个字段进行分组,根据多字段的值来进行层次分组,分组从左到右。

注意事项:

MySQL 怎样分组查询

mysql

oracle

中分组、聚合函数的区别!

今天需要这样一句

sql

:先用

group by

进行分组,然后利用聚合函数

count

或者

sum

进行计算,并显示

其它的辅助信息。

mysql

环境中,我模拟如下环境:

CREATE TABLE `room` (

`rid` varchar(5) default NULL,

`rname` varchar(5) default NULL,

`pid` int(11) default NULL,

`seq` int(11) NOT NULL auto_increment,

PRIMARY KEY

(`seq`)

) ENGINE=InnoDB DEFAULT

CHARSET=utf8

房间表,

seq

房间入住序号

(主键)

rname

为房间名,这里不考虑第三范式

情景:人住房间,

统计某个房间某个人住的次数

用户表,客人的信息

CREATE TABLE `user1` (

`ID` int(11) NOT NULL auto_increment,

`USERNAME` varchar(50) default '',

`PASSWORD` varchar(50) default '',

PRIMARY KEY

(`ID`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk

Mysql

中语句如下:

select count(u.username)

r.rname

,r.rid,r.pid

from room r,user1 u

where r.pid=u.id

group by r.rid,r.pid

这里

r.rname

并没有出现在

group by

子句、聚合函数中,但是

MYSQL

中仍然能够执行、列

出数据。

但是,在

ORACLE

中,却不能!

Oracle

环境中:

/*

--

显示:

Ora-00979 not a ORDER BY expression

--

因为:

order by

后边的

c.channel_code

不在

ORDER BY

子句中

select count(c.channel_name),m.media_name

from channel c,media m

where c.media_code = m.media_code

group by c.media_code,m.media_name

order by

c.channel_code

--

显示:

Ora-00979 not a GROUP BY expression

--

因为:

group by

或者聚合函数中没有包含

c.channel_name

select count(c.channel_name),m.media_name,

c.channel_name

from channel c,media m

Mysql 分组查询top n(多种方法)

查询每门科目的前3名。

对于查询的结果,一般有两种情况。

表所有数据为:

情况1:对于分数相同的人,其后面的人 紧跟着名次排,直到排够名次3,就不再往后取了。

情况2:对于分数相同的人,若当前相同名次的人数大于或等于 3, 则相同分数其后面的人不再参于top3了。

在情况2中 ,为什么”李四 - java“ 这行没有了呢?

可以这样理解,在情况2中相当于使用了 名次空缺 , 分数相同的人其后面那个人,的名次为 前面的人数+1 , 这里的 ”李四-java“这行,他的名次应当是 5 , 所有top3自然取不到 ”李四-java“这行。

情况2和情况 写法都是对应的, 需要注意的是 并列名次,后面的人 是否需要保持名次空缺。那么统计的时候就需要根据情况去重。

参考链接:

Mysql语法之分组数据

如何分组数据,以便能汇总表内容的子集。这涉及两个新SELECT语句子句,分别是GROUP BY子句和HAVING子句。

分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。

分组是在SELECT语句的GROUP BY 子句中建立的。

来看例子理解:

mysqlselect vend_id,COUNT(*) AS num_prods from products group by vend_id;

也就是不同的Id的商品总数都能分别查出来。

除了能用GROUP BY分组数据外,Mysql还允许过滤分组,规定包括哪些分组,排除哪些分组。

也就是HAVING子句。

mysqlselect cust_id,COUNT( /) AS orders from orders uGROUP BY/u cust_id uHAVING/u COUNT( /) =2;

注意:这里HAVING换成WHERE是不管用的。HAVING针对于分组。

WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。

那么咱么看看怎么混合WHERE和HAVING。

mysqlselect vend_id, COUNT( / ) AS num_prods from products uwhere prod_price=10 group by/u vend_id HAVING COUNT( /) =2;

mysqlselect order_num,SUM(quantity*item_price) AS ordertotal

from orderitems

GROUP BY order_num

HAVING SUM(quantity*item_price) =50

order by ordertotal;


网站栏目:mysql怎么查看分组,mysql数据库分组查询语句
本文来源:http://cqcxhl.com/article/hsjods.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP