別テーブルの特定条件にマッチしたレコード数を取得

userテーブル

個人情報が保存されている。

no name
1 AAAA
2 BBB
3 CC

user_logテーブル

userテーブルの個人情報が変更される時、変更前の情報をバックアップとして保存していく。

no no__user name
1 1 A
2 2 B
3 3 C
4 1 AA
5 2 BB
6 1 AAA

欲しい結果セット

userテーブルから全個人情報を引っ張ってくるついでにuser_logテーブルのレコード数も取得。

no log_total name
1 3 AAAA
2 2 BBB
3 1 CC

SELECT
COUNT(user.no = user_log.no__user) AS log_total,
user.no,
user.name
FROM user LEFT JOIN user_log ON user.no = user_log.no__user
GROUP BY user.no

改良版

SELECT
COUNT(user_log.no__user) AS log_total,
user.no,
user.name
FROM user LEFT JOIN user_log ON user.no = user_log.no__user
GROUP BY user.no

実行順序イメージ

※イメージなので見当はずれな可能性があります。

Aテーブル

id name
1 A
2 B
3 C

Bテーブル

id id__A
1 1
2 1
3 2
4 2
5 2

LEFT JOINされ

A.id B.id COUNT結果
1 1 null
1 2 null
2 3 null
2 4 null
2 5 null
3 null null

COUNT結果が入り(B.id != null ? 1 : 0)

A.id B.id COUNT結果
1 1 1
1 2 1
2 3 1
2 4 1
2 5 1
3 null 0

GROUP BYで纏める

A.id B.id COUNT結果
1 1 2
2 3 3
3 null 0

参考

ttp://oshiete1.goo.ne.jp/qa5341627.html