MySQL group by 单字分组序和多字段分组

我这里创建了一个 goods 表,先看下里面的数据:

mysql> select * from goods;
+----+------+------+------------+-------------+------------+
| id | s_id | b_id | goods_name | goods_price | goods_desc |
+----+------+------+------------+-------------+------------+
|  1 |    1 |    5 | book       |       22.35 | book       |
|  2 |    2 |    5 | ball       |       32.25 | ball       |
|  3 |    3 |    5 | NULL       |        3.23 | NULL       |
|  4 |    3 |    5 | macbook    |        3.23 | book       |
|  5 |    3 |    5 | listbook   |        2.30 | book       |
|  6 |    1 |    1 | nicebook   |     9999.00 | nicebook   |
|  7 |    2 |    3 | googlebook |       25.30 | book       |
+----+------+------+------------+-------------+------------+

1、根据s_id分组

mysql> select *,group_concat(goods_name) goods_names,group_concat(goods_desc) goods_descs,group_concat(id) ids,group_concat(goods_price) goods_prices  from goods group by s_id;
+----+------+------+------------+-------------+------------+------------------+---------------+-------+----------------+
| id | s_id | b_id | goods_name | goods_price | goods_desc | goods_names      | goods_descs   | ids   | goods_prices   |
+----+------+------+------------+-------------+------------+------------------+---------------+-------+----------------+
|  1 |    1 |    5 | book       |       22.35 | book       | book,nicebook    | book,nicebook | 1,6   | 22.35,9999.00  |
|  2 |    2 |    5 | ball       |       32.25 | ball       | ball,googlebook  | ball,book     | 2,7   | 32.25,25.30    |
|  3 |    3 |    5 | NULL       |        3.23 | NULL       | macbook,listbook | book,book     | 3,4,5 | 3.23,3.23,2.30 |
+----+------+------+------------+-------------+------------+------------------+---------------+-------+----------------+

这里使用了 group_concat() 函数,主要目的是为了显示分组的详细信息

上面的根据单个字段分组很简单,把相同s_id的记录都归组了

2、根据s_id,goods_desc字段分组

分析:这里查询分组时,会先根据s_id分组,然后对每个组里面的数据再根据goods_desc进行分组

mysql> select *,group_concat(goods_name) goods_names,group_concat(goods_desc) goods_descs,group_concat(id) ids,group_concat(goods_price) goods_prices  from goods group by s_id,goods_desc;
+----+------+------+------------+-------------+------------+------------------+-------------+------+--------------+
| id | s_id | b_id | goods_name | goods_price | goods_desc | goods_names      | goods_descs | ids  | goods_prices |
+----+------+------+------------+-------------+------------+------------------+-------------+------+--------------+
|  1 |    1 |    5 | book       |       22.35 | book       | book             | book        | 1    | 22.35        |
|  6 |    1 |    1 | nicebook   |     9999.00 | nicebook   | nicebook         | nicebook    | 6    | 9999.00      |
|  2 |    2 |    5 | ball       |       32.25 | ball       | ball             | ball        | 2    | 32.25        |
|  7 |    2 |    3 | googlebook |       25.30 | book       | googlebook       | book        | 7    | 25.30        |
|  3 |    3 |    5 | NULL       |        3.23 | NULL       | NULL             | NULL        | 3    | 3.23         |
|  4 |    3 |    5 | macbook    |        3.23 | book       | macbook,listbook | book,book   | 4,5  | 3.23,2.30    |
+----+------+------+------------+-------------+------------+------------------+-------------+------+--------------+

这里的goods_descs 和 上面的一比较就明白了

接下来还可以再根据 goods_price 分组

mysql> select *,group_concat(goods_name) goods_names,group_concat(goods_desc) goods_descs,group_concat(id) ids,group_concat(goods_price) goods_prices  from goods group by s_id,goods_desc,goods_price;
+----+------+------+------------+-------------+------------+-------------+-------------+------+--------------+
| id | s_id | b_id | goods_name | goods_price | goods_desc | goods_names | goods_descs | ids  | goods_prices |
+----+------+------+------------+-------------+------------+-------------+-------------+------+--------------+
|  1 |    1 |    5 | book       |       22.35 | book       | book        | book        | 1    | 22.35        |
|  6 |    1 |    1 | nicebook   |     9999.00 | nicebook   | nicebook    | nicebook    | 6    | 9999.00      |
|  2 |    2 |    5 | ball       |       32.25 | ball       | ball        | ball        | 2    | 32.25        |
|  7 |    2 |    3 | googlebook |       25.30 | book       | googlebook  | book        | 7    | 25.30        |
|  3 |    3 |    5 | NULL       |        3.23 | NULL       | NULL        | NULL        | 3    | 3.23         |
|  5 |    3 |    5 | listbook   |        2.30 | book       | listbook    | book        | 5    | 2.30         |
|  4 |    3 |    5 | macbook    |        3.23 | book       | macbook     | book        | 4    | 3.23         |
+----+------+------+------------+-------------+------------+-------------+-------------+------+--------------+

总结:这里主要是进行多个字段分组的时候,只需掌握分组顺序后面的字段是根据前面字段分组后的内容再进行的分组即可。

时间: 2024-12-21 13:33:19

MySQL group by 单字分组序和多字段分组的相关文章

mysql 按表达式或函数分组、多个字段分组、排序

按表达式或函数分组: #案例:按员工的姓名的长度分组,查询每一组的员工个数,筛选员工个数大于五 SELECT COUNT(*),LENGTH(last_name) FROM employees GROUP BY LENGTH(last_name) HAVING COUNT(*)>5; 按多个字段分组:#案例:查询每个部门每个工种的员工的平均工资 SELECT AVG(salary),department_id,job_id FROM employees GROUP BY department_i

mysql group by 对多个字段进行分组

mysql group by 对多个字段进行分组 group by X 意思是将所有具有相同X字段值的记录放到一个分组里. 那么group by  X, Y呢? group by X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里. 原文地址:https://www.cnblogs.com/beiyi888/p/9623257.html

MySQL GROUP BY 分组语句:语法及案例剖析、使用 WITH ROLLUP

MySQL GROUP BY 语句 GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. GROUP BY 语法 SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name; 实例演示 本章节实例使用到了以下表结构及数据,使用前我们可以先将以下数据导入数据库中.

Mysql group by top N的问题

在日常工作中,经常要查询分组的前几名.oracle中可以通过row_num来支持查询,mysql暂时不支持row_num.那么如何来完成这个需求呢? 例如: 表中的数据: +--------+-------+-----+ | Person | Group | Age | +--------+-------+-----+ | Bob | 1 | 32 | | Jill | 1 | 34 | | Shawn | 1 | 42 | | Jake | 2 | 29 | | Paul | 2 | 36 |

mysql group by 用法解析(详细)

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值.其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而 这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的.所以我花了很多时间来研究这个问题,网上也查不到解决方案 下面先来看看例子:

MySQL GROUP BY 语句

MySQL GROUP BY 语句 GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. GROUP BY 语法 SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name; 实例演示 本章节实例使用到了以下表结构及数据,使用前我们可以先将以下数据导入数据库中.

DB-MySQL:MySQL GROUP BY

ylbtech-DB-MySQL:MySQL GROUP BY 1.返回顶部 1. MySQL GROUP BY 语句 GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. GROUP BY 语法 SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name; 实例

mysql group by 的用法解析

1. group by的常规用法 group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤. 聚合函数max select max(user_id),grade from user_info group by grade ; 这条sql的含义很明确,将数据按照grade字段分组,查询每组最大的user_id以及当前组内容.注意,这里分组条件是grade,查询的非聚合条件也是grade.这里不产生冲突. havi

mysql “group by ”与"order by"的研究--分类中最新的内容

这两天让一个数据查询难了.主要是对group by 理解的不够深入.才出现这样的情况这种需求,我想很多人都遇到过.下面是我模拟我的内容表我现在需要取出每个分类中最新的内容 select * from test group by category_id order by `date` 结果如下明显.这不是我想要的数据,原因是msyql已经的执行顺序是 引用 写的顺序:select ... from... where.... group by... having... order by..执行顺序: