分类
MySql SQL

MySQL把多个查询结果合并JSON

一条主数据有诺干详情记录。这种场景是很常见的。有时候我们需要全部查询出来,按关联关系返回结果。

比如:每条广告发布在多个项目里,现在需要查出前10条广告所在的项目名称。

SELECT info.title,
 CONCAT('[',
  GROUP_CONCAT(
  CONCAT('{projectCode:"', gbp.projectCode, '",'),
  CONCAT('projectName:"', gbp.projectName, '"}')),
  ']') AS projectInfo FROM ghome.ghome_billboard_project AS gbp
  left join ghome.ghome_billboard_info AS info
  ON gbp.billboardId = info.billboardId
  GROUP BY gbp.billboardId
  LIMIT 10

主要是GROUP_CONCAT和CONCAT函数用法。这条sql把广告的项目信息转成json格式放在projectInfo字段。

补充(2019-03-15):

mysql的group_concat默认连接长度为1024字符,其余部分都会被截取丢掉。可以修改配置常量:

SET SESSION group_concat_max_len=102400;

或者全局:

SET GLOBAL group_concat_max_len=102400;

也可以在配置文件上加上:

group_concat_max_len = 102400;

分类
MySql SQL 笔记

实现 MySQL Top 函数【原创】

需求:查询数据,根据字段分组,取出分组后每组的前N条记录。
如果是在SQL Server中,可以使用top,取前N条记录。但是在MySQL是不支持的。网上说的比较多的是用limit N,虽然可以取到前N条,但那是分组后的N条,不是每组N条数据,所以不符合需求,排除。还有一种是使用union把多个结果连接起来,这种方法需要提前知道有分多少组,而且不适合分组太多的场景,排除。

我的实现思路:
1.查出分组后的数据。
2.使用原表数据和分组后的数据连接起来。
3.按组生成序列(从0开始)。
4.根据序列编号做为条件,找出前N条数据。

分类
MySql SQL 笔记

从SQL查询结果随机取一条数据

最近工作中会涉及复杂的SQL语句,还是挺有意思的。以前想写没有应用场景,现在正好可以多锻炼锻炼。我觉得在实际开发中,程序代码并不是最难的,最难的还是SQL。SQL逻辑性最强,而且还要很清楚表设计,业务场景。特别是复杂的业条场景下提炼数据,要考虑到功能,性能,是否会锁表。
需求:有一张表保存诺干条广告信息。当APP启动时,根据登录用户所在的区域,随机取出一条广告返回,作为启动页。

数据库:MySQL
刚开始,我的做法是:

select floor(max(startPageId) * rand()) from ghome.ghome_startpage_info where 1=1 and status!='00';

startPageId是自动增长的Integer型
其他where条件不贴出来了。这句意思是,查询符合条件的数据,根据 max 函数找出结果最大的,乘以 rand 函数随机生成的一个小于1的数,再用 floor 去掉小数位。得出一个 randId。