質問: left joinの使い方 linkテーブルとcommentテーブルがあります。 下記のようなsqlをphpから発行すると、 select c.id as cid, c.pid as cpid, c.name as cname, l.id as id, l.url as url from comment as c left join link as l on c.pid=l.id order by c.id desc limit 0, 10; $rec['cid'] や $rec['cname'] にはデータがあるのですが $rec['id'] や $rec['url'] にはデータが入っておらずnullになってしまいます。 ためしに left joinの左右を下記のように入れ替えみたところ、 select c.id as cid, c.pid as cpid, c.name as cname, l.id as id, l.url as url from link as l join comment as c left on c.pid=l.id order by c.id desc limit 0, 10; 今度は $rec['id'] や $rec['url'] にはデータがあるのですが $rec['cid'] や $rec['cname'] にはデータが入っておらずnullになってしまいました。 どこがおかしいのでしょうか? mysqlは5.1.22-rcでレンタルサーバーはcoreserverを利用しています。
回答: おそらく何もおかしなところはありません。 提示した結果になるようなsqlを書いています。 join, left join, right joinそれぞれの概念について よく調べてみる必要があるのではないかと。 下記のようなテーブルpref,teamについて考えます。 ・テーブル pref pref_cd pref_name ---------------------- 1 大阪 2 東京 3 広島 4 沖縄 ・テーブル team team_cd pref_cd team_name ------------------------------------ 1 1 タイガース 2 2 スワドーズ 3 2 ジャイアンツ 4 3 カープ 5 5 ドラゴンズ 6 6 ベイスターズ (1) join select a.pref_cd,a.pref_name,b.team_cd,b.pref_cd,b.team_name from pref a join team b on b.pref_cd = a.pref_cd [結果] a.pref_cd a.pref_name b.team_cd b.pref_cd b.team_name ------------------------------------------------------------ 1 大阪 1 1 タイガース 2 東京 2 2 スワローズ 2 東京 3 2 ジャイアンツ 3 広島 4 3 カープ (2) left join select a.pref_cd,a.pref_name,b.team_cd,b.pref_cd,b.team_name from pref a left join team b on b.pref_cd = a.pref_cd [結果] a.pref_cd a.pref_name b.team_cd b.pref_cd b.team_name ------------------------------------------------------------ 1 大阪 1 1 タイガース 2 東京 2 2 スワローズ 2 東京 3 2 ジャイアンツ 3 広島 4 3 カープ 4 沖縄 (null) (null) (null) (3) right join select a.pref_cd,a.pref_name,b.team_cd,b.pref_cd,b.team_name from pref a right join team b on b.pref_cd = a.pref_cd [結果] a.pref_cd a.pref_name b.team_cd b.pref_cd b.team_name ------------------------------------------------------------ 1 大阪 1 1 タイガース 2 東京 2 2 スワローズ 2 東京 3 2 ジャイアンツ 3 広島 4 3 カープ (null) (null) 5 5 ドラゴンズ (null) (null) 6 6 ベイスターズ (1)~(3)はそれぞれ、 (1)a join b on ~ onで指定した条件に完全に一致するもののみを表示する。 (2)a left join b on ~ 「left join」の左側にあるテーブルはすべて表示した上で、 onで指定した条件に一致する右側のテーブルのレコードがあれば その情報も付加して表示。 (2)a right join b on ~ 「right join」の右側にあるテーブルはすべて表示した上で、 onで指定した条件に一致する左側テーブルのレコードがあれば その情報も付加して表示。 といったところです。