left joinのいくつかの問題は、必ずしも左のテーブルを基準にしないで、データの行数が減少したり、データが増えたりします.

3357 ワード


left joinが終わったら、行数は必ず左の表の行数に等しいですか?必ずしも!
実験は以下の通りである.
SELECT * FROM hdd_test1 a LEFT JOIN hdd_test2 b ON a.a_id = b.b_id LIMIT 144

8 rows (134ms)
id
created_at
updated_at
a_id
id
created_at
updated_at
b_id
1
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
1
1
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
1
2
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
2
2
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
2
1
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
1
3
2018-11-05 20:44:00.0
2018-11-05 20:44:00.0
1
1
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
1
4
2018-11-05 20:44:04.0
2018-11-05 20:44:04.0
1
3
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
3
 
 
 
 
4
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
4
 
 
 
 
5
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
5
 
 
 
 
6
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
6
 
 
 
 
hdd_test 1には6つの記録があり、hdd_test 2には4つの記録があり、直接left join、6つの記録が発生しています.あまり早く喜ばないでください.次のクエリーを見てください.
SELECT * FROM hdd_test1 a LEFT JOIN hdd_test2 b ON a.a_id = b.b_id WHERE b.b_id > 1 LIMIT 144

1 row(37 ms)CSVの表示
id
created_at
updated_at
a_id
id
created_at
updated_at
b_id
2
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
2
2
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
2
 
図に示すように、where条件が外にあると、先に集約してフィルタリングするので、結果は少なくなります
 
left joinの結果の行数も左のテーブルより大きい場合があります.
SELECT * FROM hdd_test1 LIMIT 144

2 rows(33 ms)CSVの表示
id
created_at
updated_at
a_id
1
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
1
2
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
2
SELECT * FROM hdd_test2 LIMIT 144

4 rows(34 ms)CSVの表示
id
created_at
updated_at
b_id
1
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
1
2
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
2
3
2018-11-05 20:44:00.0
2018-11-05 20:44:00.0
1
4
2018-11-05 20:44:04.0
2018-11-05 20:44:04.0
1
SELECT * FROM hdd_test1 a LEFT JOIN hdd_test2 b ON a.a_id = b.b_id LIMIT 144

4 rows(110 ms)CSVの表示
id
created_at
updated_at
a_id
id
created_at
updated_at
b_id
1
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
1
1
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
1
2
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
2
2
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
2
1
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
1
3
2018-11-05 20:44:00.0
2018-11-05 20:44:00.0
1
1
2018-10-09 10:10:10.0
2018-10-09 10:10:10.0
1
4
2018-11-05 20:44:04.0
2018-11-05 20:44:04.0
1
見たか?このときbに重複するb_があるため、4つの記録が生成された.idは,このときaテーブル値のcountまたはsumを計算すると予想よりも結果が大きくなる.
簡単ですが、間違いを犯しやすいです.