こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

3つのテーブルを結合したSELECT文

お世話になります。困っているので質問させて下さい。
MySQLのSQL文に関しての質問ですが、PHPで記述しているので、このPHPのカテゴリで投稿させて頂きます。ご了承下さい。

以下のようなカラムを持ったテーブルがあります。
実際に当方で用意しているカラムそのものなのですが、簡単に説明させてもらうと、この教えてGooのような質問を投稿できるサイトで、その質問となるデータを収めるのが、questionテーブル。会員データを収めるのがuserテーブル。PHPやMySQL、HTMLのように質問のジャンルを収めておくテーブルがcategory2です。


question(テーブル)
q_no  q_user_no  q_category_no  q_titleq_exp  q_img  q_date  q_state  q_answer_cnt  q_solution  state

user(テーブル)
user_no  user_mail  user_pass  user_n_name  user_icon


category2(テーブル)
nocategory_idcategory_nocategory2_name

※上記各テーブルの最初のカラムはauto-incrementとして自動で連番を与えています。


ここで質問に移ります。
questiontテーブルに質問データがいくつか収まっている状態で、質問単位(スレッド単位)で呼出すためにURLに、questionテーブルのq_noとなる番号をパラメータで渡しているのですが、

$sql = "SELECT * FROM question WHERE q_no = '$get_q_no' AND state = 'on' AND q_state = 'on'";

このように、questionだけを呼出すと問題ないものの、3つのテーブルを結合して呼出すと一部のデータが呼び出せない状態です。

$sql = "SELECT question.q_no, question.q_user_no, question.q_category_no, question.q_title, question.q_exp, question.q_date, question.q_state, question.q_answer_cnt, question.q_solution, question.state, user.user_no, user.user_n_name, user.icon, user.user_mail, category2.no, category2.category2_name FROM question INNER JOIN user ON question.q_user_no = user.user_no INNER JOIN category2 ON question.q_category_no = category2.no WHERE question.q_no = '$get_q_no' AND question.state = 'on' AND question.q_state = 'on'";

SQL文に問題があるのでしょうが、全てのデータが呼び出せないのであればともかく、一部のデータだけ呼び出せないという状況で、どこに問題があるか分からず、この場をお借りし質問させて頂ければと投稿しました。

最後になりましたが、MySQLは、5.1.22-rcです。
お忙しいなか恐縮ですが、アドバイスのほど頂戴出来れば幸いです。
宜しくお願い申し上げます。

投稿日時 - 2013-01-17 23:09:29

QNo.7897142

すぐに回答ほしいです

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

> $sql = "SELECT * FROM question WHERE q_no = '$get_q_no' AND state = 'on' AND q_state = 'on'";

> このように、questionだけを呼出すと問題ないものの

以下の2つを投げて、上記と同じ件数が得られるかどうか、試してみては?
SELECT * FROM question INNER JOIN user ON question.q_user_no = user.user_no WHERE q_no = '$get_q_no' AND state = 'on' AND q_state = 'on'

SELECT * FROM question INNER JOIN category2 C1 ON Q1.q_category_no = C1.no WHERE q_no = '$get_q_no' AND state = 'on' AND q_state = 'on'

投稿日時 - 2013-01-17 23:29:42

お礼

bin-chan様

早速のご回答ありがとうございました。
仰られるようにテーブルを2つに別けてみたところ、各テーブルに収まっているデータに誤りがあることに気が付きました。

ジャンルの数を減らしていたのですが、それにより検索対象が変わっていた次第です。

お恥ずかしい限りですが、ご指摘頂いたことにより気付くことが出来ました。
有難うございました!

投稿日時 - 2013-01-17 23:55:30

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

userかcategory2でレコード削除してたら不一致が生じますね

投稿日時 - 2013-01-17 23:49:47

お礼

ご親切な対応に感謝いたします。
ありがとうございました!

投稿日時 - 2013-01-17 23:57:45

ANo.2

questionテーブルに格納されているq_user_noやq_category_noは
userテーブルやcategoryテーブルに確実に対応するナンバーが収まっているのでしょうか?
もし抜けてれば当然inner joinでつなぐ限り一部のデータしかでてきません。

とりあえず検証のため「inner join」の記述を「left join」に切り替えて
テストしてみてください。

投稿日時 - 2013-01-17 23:40:37

お礼

yambejp様

ご親切なご回答ありがとうございます。
仰られるように、対応するナンバーが収まっていない事に気が付きました。

お騒がせして申し訳ありません。
ご親切な対応に感謝いたします。

投稿日時 - 2013-01-17 23:57:00

あなたにオススメの質問