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

标签 mysql sql select

考虑以下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/

相关文章:

SQL 选择 : new column with values based on other column

php - 分配表 INSERT INTO 防止重复

php - 如何解决: session_start(): Cannot send session cache limiter - headers already sent

php - Mysql_fetch_array 提供的参数不是有效的 MYSQL 查询

PHP 从外部数据库中选择非常慢

C# 在 CategorizedAlphabetical 排序的 ProperyGrid 中选择第一行

mysql - 谁能给我一个带有 CASE 语句的 SELECT 示例

mysql - 数据库设计通告引用/潜在的不一致

mysql - MYsql 中多对多使用哪个数据库引擎?

sql - 如何将额外的 XML 追加/合并到 SQL Server 2005 中的现有 XML 字段中