GROUP BY 聚合函数(max min sum avg count) 和HAVING的 使用

时间:2023-03-08 20:43:21

重新复习一下这个都源自于我经常需要查的一个需求

“要找到表里面 出现了两次或者三次的某个字段”

现在假设有一张表字段是

+----+---------------------+-----------------------+---------------------+
| id | customer_service_id | refund_application_id | create_time |
+----+---------------------+-----------------------+---------------------+
| 1 | 1 | 199885 | 2016-10-27 15:39:59 |
| 2 | 2 | 199886 | 2016-10-27 15:46:33 |
| 3 | 3 | 199887 | 2016-10-27 15:47:04 |
| 4 | 4 | 199888 | 2016-10-27 15:48:41 |
| 5 | 5 | 199888 | 2016-10-27 15:48:41 |
+----+---------------------+-----------------------+---------------------+

我在现在要找出refund_applicaiton_id出现了相同的两次以上的refund_application_id 如何操作?

select * from ec_temporary_csmap group by refund_application_id HAVING count(refund_application_id)>=2;

这条语句可以帮我找到该行数据,但是他只会显示着一条

 5 |                   5 |                199888 | 2016-10-27 15:48:41 |

这是为什么呢? 因为group by会为我们对指定字段进行分组,如果分组字段有重复的值出现,则只会留其中一条,我们上面的语句就是对refund_application_id进行了分组,所以他都是唯一的,然后基于此我们使用HAVING加上聚合函数count对分组数据进行筛选。我们的条件的是refund_application_id 出现次数大于两次的分组。自然就得到了我们想要的结果。

另外需要注意的事情分组之后才能使用HAVING 来利用聚合函数来得到我们想要的结果,where指定条件里面是无法使用聚合函数的。

其实直接操作数据库的时间还是蛮多的,但是大部分时间都是在操作简单的查询语句,对于稍微复杂的语句没有更多的涉猎,及时每次用到的时候看看后面由于不经常使用就又生疏了,所以最近会陆陆续续纪录一些。