牛骨文教育服务平台(让学习变的简单)
博文笔记

mysql中一条sql语句中使用多个count关联查询多张表

创建时间:2017-11-22 投稿人: 浏览次数:1351

在给公司写代码的过程中忽然发现在sql语句中碰到一些小问题,虽然最终自己解决了,但是不得不说好不容易啊,故写此博客提醒自己,以免日后再在此处浪费时间。

需求:

有两张表,分别是marketChannelInfo表和marketDatasourceInfo表,

两张表的字段分别为:

CREATE TABLE `marketChannelInfo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `channelName` varchar(40) NOT NULL DEFAULT "" COMMENT "渠道名称",
  `channelURL` varchar(100) NOT NULL DEFAULT "" COMMENT "渠道推广链接",
  `channelType` tinyint(1) NOT NULL DEFAULT "0" COMMENT "渠道推广类型 1: h5  2 其他",
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间",
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "更新时间",
  `createBy` int(11) NOT NULL DEFAULT "0" COMMENT "创建人",
  `updateBy` int(11) NOT NULL DEFAULT "0" COMMENT "更新人",
  `version` smallint(6) NOT NULL DEFAULT "1" COMMENT "数据版本号",
  `deleted` tinyint(1) NOT NULL DEFAULT "0" COMMENT "逻辑删除标记",
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3938 DEFAULT CHARSET=utf8 COMMENT="市场推广渠道信息表"



CREATE TABLE `marketDatasourceInfo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dataType` tinyint(1) NOT NULL DEFAULT "0" COMMENT "数据类型 1:登录(引入用户)  2: 进件(引入进件) ",
  `channel` varchar(40) NOT NULL DEFAULT "" COMMENT "渠道名称",
  `dataValue` varchar(40) NOT NULL DEFAULT "" COMMENT "渠道名称",
  `dataTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "数据进入系统时间",
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间",
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_dataValue` (`dataValue`)
) ENGINE=InnoDB AUTO_INCREMENT=109851 DEFAULT CHARSET=utf8 COMMENT="市场数据引流信息表"


现在需要根据marketDatasourceInfo表查询出marketChannelInfo表内对应渠道的注册用户人数以及对应的借款人数

即显示如下数据



因为逻辑设计的缘故,代码中根据链接注册的用户在注册之后进行借贷,则之前在marketDatasourceInfo表内的信息会被会被借款信息所取代,即dataType会由1变成2,故实际的用户注册是包含借贷用户的。借贷人数则是指dataType为2的。



查询语句如下:

SELECT mci.channelName,mci.channelURL,mci.channelType,COUNT(1) AS userCount ,(SELECT COUNT(1) FROM marketDatasourceInfo mdi  WHERE mdi.`dataType`= 2 AND mdi.channel=mci.channelName) AS loanCount
FROM marketChannelInfo mci LEFT JOIN marketDatasourceInfo mdi ON mci.channelName=mdi.channel GROUP BY mci.channelName ORDER BY mci.createTime DESC LIMIT 0,10  

注意点:

1.group by

2.(SELECT COUNT(1) FROM marketDatasourceInfo mdi  WHERE mdi.`dataType`= 2 AND mdi.channel=mci.channelName) AS loanCount


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。