这里想要实现的是的查询不通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
当用select*from 表名 group by '字段名1' 将选出来的内容将按照字段1分组,其他列不尽相同,会以最前面的内容显示:
GROUP BY 后面可以跟多个列名,表示以多列作为分组依据:
mysql select ◆name◆,◆date◆,count(*) from ◆employee_tbl◆ group by ◆name◆,date;
◆------◆---------------------◆----------◆
| name | date? ? ? ? ? ? ? ? | count(*) |
group by 后可以跟with? rollup,表示在进行分组统计的基础上再次进行汇总统计(在每个分组下都会有统计汇总):
mysql select*from r;
◆------◆-----◆------◆
| name | cat | fish |
| 小明 | x? | 1? ? |
| 小明 | z? | 1? ? |
| 小红 | x? | 1? ? |
| 小红 | y? | 1? ? |
| 小青 | z? | 1? ? |
mysql select name,cat,fish,count(*) from r group by name with rollup;
◆------◆-----◆------◆----------◆
| name | cat | fish | count(*) |
mysql select name,cat,fish,count(*) from r group by name,cat with rollup;
◆------◆------◆------◆----------◆
| name | cat? | fish | count(*) |
| 小明 | z? ? | 1? ? |? ? ? ? 1 |
mysql select name,cat,fish,count(*) from r group by name,cat,fish with rollup;
| 小红 | x? ? | 1? ? |? ? ? ? 1 |
| 小红 | y? ? | 1? ? |? ? ? ? 1 |
| 小明 | x? ? | 1? ? |? ? ? ? 1 |
| 小明 | z? ? | NULL |? ? ? ? 1 |
| 小青 | y? ? | NULL |? ? ? ? 1 |
| 小青 | z? ? | 1? ? |? ? ? ? 1 |
mysql select name,cat,fish,sum(fish) from r group by name with rollup;
◆------◆-----◆------◆-----------◆
| name | cat | fish | sum(fish) |
mysql select name,cat,fish,sum(fish) from r group by name,cat with rollup;
◆------◆------◆------◆-----------◆
| name | cat? | fish | sum(fish) |
| 小明 | z? ? | 1? ? |? ? ? ? 1 |
mysql select name,cat,fish,sum(fish) from r group by name,cat,fish with rollup;
| 小红 | x? ? | 1? ? |? ? ? ? 1 |
| 小红 | y? ? | 1? ? |? ? ? ? 1 |
| 小明 | x? ? | 1? ? |? ? ? ? 1 |
| 小明 | z? ? | NULL |? ? ? ? 1 |
| 小青 | z? ? | 1? ? |? ? ? ? 1 |
————————————————
MySQL中使用 GROUP BY 对数据进行分组,GROUP BY从字面意义上理解就是根据'BY'指定的规则对数据进行分组, 所谓分组就是将一个'数据集'划分成若干个'子区域',然后针对若干个'小区域'进行数据处理 .基本语法形式为:
字段值为进行分组时所依据的列名称, "HAVING 条件表达式" 指定满足表达式限定条件的结果将被显示.
GROUP BY关键字通常和集合函数一起使用,例如:MAX()、MIN()、COUNT()、SUM()、AVG().即把数据分为多个逻辑组,并对每个组进行集合计算.
WHERE 子句过滤行,在数据分组前过滤;HAVING 子句过滤分组,在数据分组后过滤.WHERE排除的行不包括在分组里,且HAVING支持所有WHERE操作符.
使用GROUP BY可以对多个字段进行分组,根据多字段的值来进行层次分组,分组从左到右.
注意事项:
mysql
与
oracle
中分组、聚合函数的区别!
今天需要这样一句
sql
:先用
group by
进行分组,然后利用聚合函数
count
或者
sum
进行计算,并显示
其它的辅助信息.
在
环境中,我模拟如下环境:
CREATE TABLE ◆room◆ (
◆pid◆ int(11) default NULL,
◆seq◆ int(11) NOT NULL auto_increment,
PRIMARY KEY
(◆seq◆)
) ENGINE=InnoDB DEFAULT
房间表,
seq
房间入住序号
(主键)
,
rname
为房间名,这里不考虑第三范式
情景:人住房间,
统计某个房间某个人住的次数
用户表,客人的信息
CREATE TABLE ◆user1◆ (
◆ID◆ int(11) NOT NULL auto_increment,
(◆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
这里
并没有出现在
子句、聚合函数中,但是
MYSQL
中仍然能够执行、列
出数据.
但是,在
ORACLE
中,却不能!
!
Oracle
环境中:
/*
--
显示:
因为:
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
或者聚合函数中没有包含
c.channel_name
select count(c.channel_name),m.media_name,
对于查询的结果,一般有两种情况.
表所有数据为:
参考链接:
如何分组数据,以便能汇总表内容的子集.这涉及两个新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子句.
注意:这里HAVING换成WHERE是不管用的.HAVING针对于分组.
WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤.
那么咱么看看怎么混合WHERE和HAVING.
mysqlselect order_num,SUM(quantity*item_price) AS ordertotal
from orderitems
GROUP BY order_num
order by ordertotal;
以上就是土嘎嘎小编为大家整理的mysql怎么查看分组相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!