符合中小企业对网站设计、功能常规化式的企业展示型网站建设
本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...
商城网站建设因基本功能的需求不同费用上面也有很大的差别...
手机微信网站开发、微信官网、微信商城网站...
这里想要实现的是的查询不通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(*) |
+------+---------------------+----------+
| 小丽 | 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 对数据进行分组,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
进行计算,并显示
其它的辅助信息。
在
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
查询每门科目的前3名。
对于查询的结果,一般有两种情况。
表所有数据为:
情况1:对于分数相同的人,其后面的人 紧跟着名次排,直到排够名次3,就不再往后取了。
情况2:对于分数相同的人,若当前相同名次的人数大于或等于 3, 则相同分数其后面的人不再参于top3了。
在情况2中 ,为什么”李四 - java“ 这行没有了呢?
可以这样理解,在情况2中相当于使用了 名次空缺 , 分数相同的人其后面那个人,的名次为 前面的人数+1 , 这里的 ”李四-java“这行,他的名次应当是 5 , 所有top3自然取不到 ”李四-java“这行。
情况2和情况 写法都是对应的, 需要注意的是 并列名次,后面的人 是否需要保持名次空缺。那么统计的时候就需要根据情况去重。
参考链接:
如何分组数据,以便能汇总表内容的子集。这涉及两个新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;