sql:group by和 max

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql:group by和 max相关的知识,希望对你有一定的参考价值。

通过group by,having,max实现查询出每组里指定列中最大的内容

例如:我需要实现的功能是

获取每个模块中点击量最大的内容(表中有许多内容,内容里)

我写的查询语句如下

 

技术分享

 

查询结果如下:

 

技术分享

 

然而在我的数据库中,共有5个mod,mod_id分别为1,2,3,4,15

 

技术分享

技术分享

 

查询结果自动忽略了mod_id=4的数据们。原因是mod_id=4的模块的最大点击量88不是第一个出现的mod_id=4的内容。其它的四个最大值都是自己模块中第一个出现的内容。

这说明我的查询语句有问题。

 

解决方案:

将一条查询语句分成两条查询语句

技术分享

 

 第一个查询语句取出每个mod中click_num的最大值和对应的mod_id,

然后在第二句里再查询,并将每次的查询结果附加到slice中。查询结果:

技术分享

如图,modID=4的结果查询出来了。

 

-----此处是分割线----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

不过由于一个Mod里的最大click_num可能不止一个,所以在上例中的第二句的查询方式最好使用QueryRows而不是QueryRow. hotcontent的类型也最好改为[]DtContent (DtContent是我定义的一个和数据库中的表相对应的struct),append也没法使用了,换成使用copy。。

技术分享

 

 

 

不过结果并不乐观,总是出现这种错误:

技术分享

 

 

(原来是我将copy(hotcontents,hotcontent)写成了copy[,],并不是见鬼了==!!!不过白白浪费许多时间,实在是粗心。)

 

不过hotcontents并没有如我愿不断变长,hotcontent的内容并没有复制到hotcontents里,生成结果里许多[] []都是hotcontents

技术分享

原因是:

技术分享

 

因为我通过 var hotcontents []DtContent声明的slice没有设置长度,这样hotcontent就复制不进去。因为我无法确信有多少hotcontent,所以我就依据每个模块*10来设置hotcontents的长度

技术分享

 

终于解决了,不过由于我声明的时候给的长度太大了,所以slice里有许多空值,耗费资源。

所以我希望能够动态的增加长度。

 

以上是关于sql:group by和 max的主要内容,如果未能解决你的问题,请参考以下文章

sql group by 之后 如何合并分组的文本

SQL --------------- GROUP BY 函数

SQL group by:选择另一列有其最小值/最大值的值

错误代码:1055 与 sql_mode=only_full_group_by 不兼容

SQL - GROUP BY和ORDER BY MIN

SQL GROUP BY 语句与实战例题