gpt4 book ai didi

MySQL Count 来自多个表的匹配记录

转载 作者:行者123 更新时间:2023-11-29 05:32:54 25 4
gpt4 key购买 nike

考虑以下4个表

entity  table1        table2        table3       
------ ------------- ------------- -------------
id ei(entity.id) ei(entity.id) ei(entity.id)
name something somethingelse yetanother

如何找出所有三个表中的实体用法,表示方式

---------------------
| id | t1 | t2 | t3 |
---------------------
| 1 | 14 | 23 | 0 |
| 2 | 66 | 9 | 5 |
...

我最初的方法是从实体中选择然后左连接其他表,但 MySQL 似乎不喜欢它

SELECT e.id,count(t1.id) FROM entity AS e LEFT JOIN table1 AS t1 on e.id=t1.ei;

编辑:这是 1 个表的输出

mysql> explain select e.id,count(o.id) from entity e left join table1 t1 on e.id=o.ei where e.ty=3;+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra       |+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+|  1 | SIMPLE      | e     | ALL  | NULL          | NULL | NULL    | NULL |  1083 | Using where ||  1 | SIMPLE      | o     | ALL  | NULL          | NULL | NULL    | NULL | 90201 |             |+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+2 rows in set (0.04 sec)

The opposite works much better, but doesn't scale to multiple tables

SELECT e.id,count(t1,id) FROM table1 AS t1 LEFT JOIN entity AS e ON t1.ei=e.id

最佳答案

重写此查询的另一种方法。

在每个表中单独分组和计数,然后加入:

SELECT  a.id, 
COALESCE(b.t1, 0) AS t1,
COALESCE(c.t2, 0) AS t2,
COALESCE(d.t3, 0) AS t3
FROM
entity a
LEFT JOIN
( SELECT ei,
COUNT(*) AS t1
FROM table1
GROUP BY ei
) AS b
ON a.id = b.ei
LEFT JOIN
( SELECT ei,
COUNT(*) AS t2
FROM table2
GROUP BY ei
) AS c
ON a.id = c.ei
LEFT JOIN
( SELECT ei,
COUNT(*) AS t3
FROM table3
GROUP BY ei
) AS d
ON a.id = d.ei
;

如果您还没有的话,您绝对应该在 3 个表中的每一个的 (ei) 上添加一个索引。

关于MySQL Count 来自多个表的匹配记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13271843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com