1

次の4つの表を考慮する

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

次のように表される、3つのテーブルすべてでエンティティの使用法を把握するにはどうすればよいですか

---------------------
| 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> 説明 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 | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 エクストラ |
+----+-------------+-------+------+--------------- +------+---------+------+-------+-------------+
| | 1 | シンプル | e | すべて | ヌル | ヌル | ヌル | ヌル | 1083 | where | の使用
| | 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 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 に答える
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 に答える