• ベストアンサー
  • 困ってます

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を利用しています。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数451
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

おそらく何もおかしなところはありません。 提示した結果になるような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で指定した条件に一致する左側テーブルのレコードがあれば   その情報も付加して表示。 といったところです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

例を挙げて頂いたので理解が深まりました。 もう一度見直してみます。 どうもありがとうございました。

関連するQ&A

  • LEFT JOINを多用するのはよくないですか?

    PHP4+MySQL4.0 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2085277 の続きなのですが、同質問にご回答下さったsaintandreさんのSQL例文を 拡張して、下記のように2年分(24か月=24行)をLEFT JOINしようとしたら、 phpMyAdmin上でSQL文を発行しても結果がなかなか返ってこなかったり PHP4で簡単なHTMLリストを書き出すプログラムをIE6上で実行しても 途中で「ページがみつかりません」になったりで、結果が得られないことの方が 多いです。SQL文1本で強引に解決することはあきらめたほうがよいでしょうか。 画期的な解決策がもしあればご教示ください。 SELECT `社員マスター`.`社員ID` AS `名前ID` ,`社員マスター`.`名前` AS `名前` ,`社員マスター`.`性別` AS `性別` ,`出席日数200601`.`出席日数` AS `出席日数200601` ,`出席日数200602`.`出席日数` AS `出席日数200602`    :  (…途中20か月分・略…)    : ,`出席日数200611`.`出席日数` AS `出席日数200611` ,`出席日数200712`.`出席日数` AS `出席日数200712` FROM `社員マスター` LEFT JOIN `出席テーブル` AS `出席日数200601` ON `社員マスター`.`社員ID` = `出席日数200601`.`社員ID` AND `出席日数200601`.`年月` = '200601' LEFT JOIN `出席テーブル` AS `出席日数200602` ON `社員マスター`.`社員ID` = `出席日数200602`.`社員ID` AND `出席日数200602`.`年月` = '200602'    :  (…途中20か月分・略…)    : LEFT JOIN `出席テーブル` AS `出席日数200711` ON `社員マスター`.`社員ID` = `出席日数200711`.`社員ID` AND `出席日数200711`.`年月` = '200711' LEFT JOIN `出席テーブル` AS `出席日数200712` ON `社員マスター`.`社員ID` = `出席日数200712`.`社員ID` AND `出席日数200712`.`年月` = '200712'

    • ベストアンサー
    • MySQL
  • phpとmysqlでデータの一覧表示をしたいと思っています。

    phpとmysqlでデータの一覧表示をしたいと思っています。 ずらーっと並べるだけでなく、1ページに100件した場合には 10行毎に<hr>や<br>などのタグを挿入して間隔を空けたいのですが どのようにしたらいいのか悩んでいます。 現在は下記のようにLIMITで何度もqueryを発行しています。 できれば1回のqueryで処理したいのですが 他にどのような方法があるでしょうか。 $rs = mysql_query("select * from data order by id desc LIMIT 0,10 ;",$conn); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $site = $rec['site']; $url = $rec['url']; echo '<a href="'.$url.'">'.$site.'</a>'; } $rs = mysql_query("select * from data order by id desc LIMIT 10,10 ;",$conn); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $site = $rec['site']; $url = $rec['url']; echo '<a href="'.$url.'">'.$site.'</a>'; } $rs = mysql_query("select * from data order by id desc LIMIT 20,10 ;",$conn); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $site = $rec['site']; $url = $rec['url']; echo '<a href="'.$url.'">'.$site.'</a>'; } よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • MySQLでLEFT JOIN

    MySQL4.0.26でテーブルの左外部結合がしたいです。 左テーブルAと 右テーブルBをWHERE句で抽出したもの を結合することはできないのでしょうか? 考えた以下の式ではエラーが出てしまいます。 SELECT * FROM A LEFT JOIN ( SELECT * B WHERE id = 1 ) AS B2 ON A.id = B2.id

    • ベストアンサー
    • MySQL
  • LEFT JOIN とRIGHT JOINの合体版のような結合方法。

    LEFT JOIN とRIGHT JOINの合体版のような結合方法。 使用DBはMySQL5.0.45です。 2つのテーブルの結合方式で、結合条件に合致しなかった場合、 両方のデータを結果セットに含めることはできますか? LEFT JOINだと、左側のテーブルのデータは結果に返ってきて、右側のデータはNULLになります。 RIGHT JOINだと、右側のテーブルのデータは結果に返ってきて、左側のデータはNULLになります。 これを「左側データあり右側NULL」「左側NULL右側データあり」というレコードを混ぜて結果として返したいです。 具体的には、 以下二つのテーブルがあるとします。 table : test1 value  id ------------------- ああ   3 いい   4 うう     5 table : test2 value  id -------------------- AAA   1 BBB   2 CCC   3 DDD   4 id を結合条件のキーとして、以下のような結果を得たいです。 NULL  NULL  AAA   1 NULL  NULL  BBB   2 ああ   3     CCC   3 いい   4     DDD   4 うう    5    NULL   NULL LEFT JOINだと以下の結果に、 SELECT * FROM test1 LEFT JOIN test2 ON test1.id=test2.id ああ   3     CCC   3 いい   4     DDD   4 うう    5    NULL   NULL RIGHT JOINだと以下の結果になってしまいます。 SELECT * FROM test1 RIGHT JOIN test2 ON test1.id=test2.id NULL  NULL  AAA   1 NULL  NULL  BBB   2 ああ   3     CCC   3 いい   4     DDD   4 以上、ご教示お願い致します。

    • ベストアンサー
    • MySQL
  • 3つのテーブルの処理について

    下記のようなテーブルがあったとして、 テーブルAを基準に考えたいのですが、、、、 テーブルAに付加する形でテーブルBのデータのidカウント数が最も少なく、idが同じもの中でdate日が一番新しいデータを表示し、古いものから並べかえかつテーブルCにidがあるものは一番最後にくるという風に並べかえたいのですが、無理でしょうか? 現在下記のようなSQLを考えていますが、うまくいかないです。。 select * from A left join(select id,case when count(id)=0 then 0 else count(id) end AS cnt FROM B group by id order by date) as b on A.id=b.id left join(select id from C) as c on A.id=c.id order by c.id desc,b.cnt; エラー↓ in the GROUP BY clause or be used in an aggregate function テーブルA id | name | comment| 1 あ   おい 2 い   えい 3 か   テス テーブルB id | event | date | 1 test1 2005/1/4 2 test1 2005/1/4 1 test2 2005/3/4 2 test2 2005/3/4 1 test3 2005/5/4 テーブルC id | 1 理想の結合データ id | name | comment| cnt | date | 3 か   テス 0    2 い   えい 2  2005/3/4  1 あ   おい 3 2005/5/4

  • 値がNullの場合のクエリーの条件

    AとB2つのテーブルを結合させて、BにあるIDをIDごとに集計しようと思っています。もちろん値がないIDは表示されません。そこで値がないIDも表示させたいのですが、どのようにすればいいのでしょうか? SELECT AList.Cid, AList.Cname, Count(BList.Cid) AS [Count] INTO 月別集計 FROM BList RIGHT JOIN AList ON BList.Cid = AList.Cid WHERE (((BList.Date)>=[Forms]![集計]![day1] And BList.Date)<=[Forms]![集計]![day2])) GROUP BY AList.Cid, AList.Cname ※⇒HAVING (((IIf(IsNull(Count([dbo_KAccessList].[Cid])),0))<>False)) ORDER BY AList.Cid; ※のような条件をクエリーにつけてみましたがダメでした。 よろしくお願いします。

  • joinの入れ子について

    A(contenthead)をベースにAがBに存在せずかつCに存在しないデータをを作りたいのですが上手く行きません。以下を実行すると SELECT a.contentid, b.contentid, d.contentid From (contenthead as a LEFT JOIN group as b on a.contentid = b.contentid) left join (contenthead as c LEFT JOIN ouser as d on c.contentid = d.contentid) on a.contentid = c.contentid 表示結果は 1、1、NULL 2、NULL、Null 3、NULL、3 4、NUL、4 と出て来ます。従って両方にないのは2だけということになります。 実際のデータもそうなっています。 そこで、 WHERE ((b. contentid) is null) and ((d. contentid) is null)を上記SQLに付加するとなぜか 2、NULL、Null 3、NULL、null 4、NUL、NULL と表示されます。 教えて頂きたいことお分かり戴けますでしょうか宜しく御願い致します。

    • ベストアンサー
    • MySQL
  • mysql_fetch_arrayとテンプレートの使い方

    データベースからランダムに取り出した3つのデータがあります。 取り出したデータにはそれぞれid、name、ageのデータが入っています。 $rs = mysql_query("select * FROM table order by Rand() LIMIT 0,3;",$con); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $tpl->assign(array( id => $rec[id], name => $rec['name'], age => $rec[age] )); } これだと1種類のデータが3つ連続して表示されてしまいました。 3種類のデータを全部表示するにはどのようにしたらよいのでしょうか? テンプレート(?)の使い方がよく分かっていないので検討違いのことをしている気がしますがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • left outer joinが上手くいきません

    四つのテーブルに分かれたデータを、結合しつつ、結合後のテーブルのデータがチェック用テーブルに含まれていないものを抽出したいのですが、left outer joinなど色々ためしても、構文エラーなどになって上手くいきません。 具体的に書くと、 【顧客名テーブル:customer】 顧客ID:customer_id 顧客コード:customer_code 顧客名:customer_name 【最新申込みテーブル:recently】 顧客ID:customer_id 日付:order_date 【過去申込みテーブル:old】 顧客ID1:customer_id1 顧客ID2:customer_id2 日付:order_date 【チェック用テーブル:check】 顧客コード:customer_code 顧客名:customer_name とあるとします。 【最新購入テーブル】と【過去購入テーブル】の両方の顧客IDを抽出し、【顧客名テーブル】の顧客IDと紐付けしてから、顧客コードの一覧を作り、【チェック用テーブル】の顧客コードに含まれない、【顧客名テーブル】の顧客コードを一覧で出力したいのですが、なかなか上手くいかなくて困っています。 ややこしいのは、【過去購入テーブル】の中に含まれる顧客ID1、顧客ID2ともに、フィールド名は違いますが、登録されるデータは、【顧客名テーブル】の顧客IDと同じになるので、【最新購入テーブル】と【過去購入テーブル】で抽出する顧客ID一覧は、 顧客ID:customer_id 顧客ID1:customer_id1 顧客ID2:customer_id2 の三つになります。 UNIONなどで結合した顧客ID一覧を【顧客名テーブル】とつないで顧客コードを出して...など色々やってはみましたが、構文エラーが多く、そもそもどこが間違っているかもよくわからなくて、困っています(>_<)

    • ベストアンサー
    • MySQL
  • クエリの遅さの原因

    下記のクエリーをそれぞれ試してみたところ、圧倒的に下の方が遅くなってしまいました。 $rs = mysql_query("select * from A INNER JOIN B ON B.cat = A.id order by B.id desc LIMIT 1, 10 ;",$con); $rs = mysql_query("select * from A INNER JOIN B ON B.cat = A.id where B.name is not null group by B.area order by B.id desc LIMIT 1, 10 ;",$con); where B.name is not null group by B.area この処理はそれほど負荷が掛かってしまうのでしょうか。 他に良い書き方(方法)がありましたら教えてください。

    • ベストアンサー
    • MySQL