1

考虑以下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;
+----+-------------+--------+------+--------------- +------+---------+------+--------+-----------+
| 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 |
+----+-------------+--------+------+--------------- +------+---------+------+--------+-----------+
| 1 | 简单 | 电子| 全部 | 空 | 空 | 空 | 空 | 1083 | 使用位置 |
| 1 | 简单 | ○ | 全部 | 空 | 空 | 空 | 空 | 90201 | |
+----+-------------+--------+------+--------------- +------+---------+------+--------+-----------+
2 行(0.04 秒)

相反的效果要好得多,但不能扩展到多个表

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

3 回答 3

1
SELECT  a.ID, 
        COUNT(b.ei) t1,
        COUNT(c.ei) t2,
        COUNT(d.ei) t3
FROM    entity a
        LEFT JOIN table1 b
            ON a.id = b.ei
        LEFT JOIN table2 c
            ON a.id = c.ei
        LEFT JOIN table3 d
            ON a.ID = d.ei
GROUP BY a.ID
于 2012-11-07T14:36:04.700 回答
1
select select 
e.id,
sum(case when t1.name is null then 0 else 1 end) t1,
sum(case when t2.name is null then 0 else 1 end) t2,
sum(case when t3.name is null then 0 else 1 end) t3
from
entity e left join table1 t1 on e.id=t1.ei left join table2 t2 on e.id=t2.ei left join table3 t3 on e.id=t3.ei
group by e.id

==

SQL 小提琴演示

于 2012-11-07T14:51:15.447 回答
1

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

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

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
  ;

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

于 2012-11-07T15:19:35.947 回答