mysql多表关联count查询样例

建表:

注意:这些建表语句,是先删除表,再创建的,如果有表,删除drop语句。

DROP TABLE IF EXISTS `lyb_activity`;
CREATE TABLE `lyb_activity` (
  `id` varchar(32) NOT NULL,
  `create_time` datetime DEFAULT NULL,
  `status` int(11) NOT NULL,
  `title` varchar(100) DEFAULT NULL,
  `user_id` varchar(32) DEFAULT NULL,
  `vote_status` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `lyb_activity_judge`;
CREATE TABLE `lyb_activity_judge` (
  `id` varchar(32) NOT NULL,
  `activity_id` varchar(32) DEFAULT NULL,
  `user_id` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `lyb_activity_work`;
CREATE TABLE `lyb_activity_work` (
  `id` varchar(32) NOT NULL,
  `activity_id` varchar(32) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `doc_file_id` varchar(32) DEFAULT NULL,
  `title` varchar(100) DEFAULT NULL,
  `vote_num` int(11) NOT NULL,
  `score` double NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表名1:lyb_activity

表名2:lyb_activity_judge

表名3:lyb_activity_work

查询:查询表1的所有属性,以及表2关联表1的数量,以及表3关联表1的数量。

语句如下:

select a.*,count(distinct j.id) as '表2关联数量',count(distinct w.id) as '表3关联数量'

from lyb_activity a 

left join lyb_activity_judge j on a.id = j.activity_id 

left join lyb_activity_work w on a.id = w.activity_id 

group by a.id order by a.create_time asc;

查询结果:

如果不加distinct,那么查询出来的统计的数量不正确,count的数量是两个count的正确值的乘积。

因为left join 表时,以 lyb_activity 为基础,lyb_activity_judge 如果有3条记录,lyb_activity_work 有2条记录,那么查询出来的数据条数,是 关联的两个表的数据条数的乘积,即查询出6条数据,然后再count时,两个count的值就都是6了,而不是一个3,一个2。

 

 

### MySQL 查询语句示与语法 以下是关于 MySQL 中常见的查询语句及其用法: #### 基本查询 通过 `SELECT` 语句可以实现从中提取数据的功能。如,如果需要获取某个中的所有列,则可以直接使用星号 (`*`) 进行操作[^1]。 ```sql SELECT * FROM table_name; ``` #### 使用 WHERE 子句过滤记录 为了筛选满足特定条件的数据,可以在 `SELECT` 后附加 `WHERE` 子句来指定约束条件[^3]。 ```sql SELECT column1, column2 FROM table_name WHERE condition; ``` **示**: 查找销售额大于 1000 的商店名称和信息。 ```sql SELECT store_name, store_info FROM store_info WHERE Sales > 1000; ``` #### 排序结果 (ORDER BY) 利用 `ORDER BY` 可以按照某一列升序或降序排列检索到的结果集。默认情况下为升序排序;若需降序则应显式声明关键字 `DESC`。 ```sql SELECT column_list FROM table_name ORDER BY sort_column ASC|DESC; ``` **实**: 对上述子按销售量由高至低展示店铺详情。 ```sql SELECT store_name, store_info FROM store_info WHERE Sales > 1000 ORDER BY Sales DESC; ``` #### 数据去重 (DISTINCT) 当希望返回唯一不同的值时可采用 DISTINCT 关键字去除重复项。 ```sql SELECT DISTINCT column_name(s) FROM table_name; ``` #### 分页处理 (LIMIT 和 OFFSET) 对于大数据量场景下分批次读取很有帮助的是 LIMIT 结合 OFFSET 实现分页功能。 ```sql SELECT columns FROM tables LIMIT number_of_rows OFFSET offset_value; ``` ****: 获取前五条记录之后再拿三条新纪录出来看。 ```sql SELECT * FROM employees LIMIT 3 OFFSET 5; ``` #### 联接格 (JOINs) 复杂业务逻辑往往涉及关联实体间交互分析,在这种场合 JOIN 类型就显得尤为重要了。 ##### INNER JOIN 内连接 仅保留两个关系中共有的部分作为最终输出成果之一种形式即内部交集现方式如下所示: ```sql SELECT A.*, B.* FROM TableA AS A INNER JOIN TableB AS B ON A.key = B.foreignKey; ``` ##### LEFT OUTER JOIN 左外连结 即使右侧源不存在对应匹配项目也会把左侧全部呈现出来的左外部联合达方法形如下面这给出的子那去做就好啦! ```sql SELECT Customers.CustomerName, Orders.OrderID FROM Customers LEFT JOIN Orders ON Customers.CustomerID=Orders.CustomerID ORDER BY Customers.CustomerName; ``` #### 高级特性 - 子查询(Subqueries) 有时候我们需要嵌套一层或层额外的小查询结构体于主干之中完成更精细控制目的时候需要用到子询问技术。 **案说明:** 找出那些订单数量超过平均水平以上的客户编号列. ```sql SELECT CustomerID FROM Orders GROUP BY CustomerID HAVING COUNT(OrderID) > ( SELECT AVG(total_orders_per_customer) FROM ( SELECT COUNT(*) as total_orders_per_customer FROM Orders GROUP BY CustomerID ) t ); ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值