2011-11-08 2 views
1

私は4つのテーブルがあります。クエリは

mysql> describe solution_sections; 
+---------------------+---------------+------+-----+---------+----------------+ 
| Field    | Type   | Null | Key | Default | Extra   | 
+---------------------+---------------+------+-----+---------+----------------+ 
| solution_section_id | int(10)  | NO | PRI | NULL | auto_increment | 
| display_order  | int(10)  | NO |  | NULL |    | 
| section_name  | varchar(1000) | YES |  | NULL |    | 
+---------------------+---------------+------+-----+---------+----------------+ 
3 rows in set (0.00 sec) 

mysql> describe suggested_solution_comments; 

+-----------------------+----------------+------+-----+---------+----------------+ 
| Field     | Type   | Null | Key | Default | Extra   | 
+-----------------------+----------------+------+-----+---------+----------------+ 
| comment_id   | int(10)  | NO | PRI | NULL | auto_increment | 
| problem_id   | int(10)  | NO |  | NULL |    | 
| suggested_solution_id | int(10)  | NO |  | NULL |    | 
| commenter_id   | int(10)  | NO |  | NULL |    | 
| comment    | varchar(10000) | YES |  | NULL |    | 
| solution_part   | int(3)   | NO |  | NULL |    | 
| date     | date   | NO |  | NULL |    | 
+-----------------------+----------------+------+-----+---------+----------------+ 


mysql> describe users; 
+--------------+---------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+--------------+---------------+------+-----+---------+----------------+ 
| user_id  | int(10)  | NO | PRI | NULL | auto_increment | 
| first_name | varchar(100) | NO |  | NULL |    | 
| last_name | varchar(100) | NO |  | NULL |    | 
| email  | varchar(150) | NO |  | NULL |    | 
| user_pass | varchar(40) | NO |  | NULL |    | 
| zip   | varchar(100) | NO |  | NULL |    | 
| country  | varchar(100) | NO |  | NULL |    | 
| city   | varchar(100) | NO |  | NULL |    | 
| state  | varchar(100) | NO |  | NULL |    | 
| lat   | float(9,6) | YES |  | NULL |    | 
| lng   | float(9,6) | YES |  | NULL |    | 
| agreed_terms | tinyint(1) | YES |  | NULL |    | 
| join_date | date   | NO |  | NULL |    | 
| last_login | date   | NO |  | NULL |    | 
| bio_blurb | varchar(5000) | YES |  | NULL |    | 
+--------------+---------------+------+-----+---------+----------------+ 
15 rows in set (0.03 sec) 

mysql> describe member_photo; 
+-------------------+---------------+------+-----+---------+----------------+ 
| Field    | Type   | Null | Key | Default | Extra   | 
+-------------------+---------------+------+-----+---------+----------------+ 
| photo_id   | int(10)  | NO | PRI | NULL | auto_increment | 
| member_id   | int(10)  | NO |  | NULL |    | 
| photo_description | varchar(3000) | YES |  | NULL |    | 
| photo_path  | varchar(1000) | NO |  | NULL |    | 
| small_thumb  | varchar(1000) | YES |  | NULL |    | 
| mid_thumb   | varchar(1000) | YES |  | NULL |    | 
| is_main_photo  | tinyint(1) | YES |  | NULL |    | 
+-------------------+---------------+------+-----+---------+----------------+ 

をそして私は、このようなクエリがあります。

select comment_id, 
     commenter_id, 
     section_name, 
     comment, 
     solution_part, 
     display_order, 
     solution_section_id, 
     suggested_solution_id, 
     DAYOFMONTH(date), 
     DAYNAME(date), 
     YEAR(date), 
     MONTH(date), 
     first_name, 
     last_name, 
     email, 
     small_thumb, 
     mid_thumb 
from solution_sections 
left join suggested_solution_comments on 
    solution_sections.solution_section_id = suggested_solution_comments.solution_part 
left join users on 
    suggested_solution_comments.commenter_id = users.user_id 
left join member_photo on 
    suggested_solution_comments.commenter_id = member_photo.member_id 
where suggested_solution_id = 61 OR 
     suggested_solution_id IS NULL 
order by solution_section_id, 
     comment_id, 
     section_name, 
     comment, 
     solution_part, 
     display_order; 

をどのようにその行うことになってから、各SECTION_NAMEを取得していますsolution_sectionsテーブルを作成し、コメント(および誰がコメントしたかに関するデータ)を見つけます。時にはコメントはありませんが、少なくともsection_nameを持つ行と他のすべてがnullである行を返す必要があります。

しかし、何らかの理由でそれはしません。そして、一番奇妙な点は、一致する異なるsuggested_solution_idを与えると、solution_sectionsのすべての行が返されるということです。

このようなことが起こる理由は何ですか?ありがとうございました!!

そして、私はただ一つのことを認識しました。もしproblem_idについて別のコメントが作成されていれば、このクエリはそのセクションの行を返しません。

+0

私は今、それをテストしています。それはバグがどこにあるのかと思われますが、何が間違っているのか正確にはわかりません。 – GeekedOut

答えて

1

子レコードが終了することが保証されていない場合は、親テーブルのすべてのレコードを表示する必要があります。

select * from 
(
    select sc.comment_id, 
      sc.commenter_id, 
      ss.section_name, 
      sc.comment, 
      sc.solution_part, 
      ss.display_order, 
      ss.solution_section_id, 
      sc.suggested_solution_id, 
      DAYOFMONTH(sc.date), 
      DAYNAME(sc.date), 
      YEAR(sc.date), 
      MONTH(sc.date), 
      u.first_name, 
      u.last_name, 
      u.email, 
      mp.small_thumb, 
      mp.mid_thumb 
    from solution_sections ss 
    left outer join suggested_solution_comments sc on ss.solution_section_id = sc.solution_part 
    left outer join users u on sc.commenter_id = u.user_id 
    left outer join member_photo mp on sc.commenter_id = mp.member_id) a 
where a.suggested_solution_id = 61 OR 
     a.suggested_solution_id IS NULL 
order by a.solution_section_id, 
     a.comment_id, 
     a.section_name, 
     a.comment, 
     a.solution_part, 
     a.display_order; 

はEDIT:

私はまた、このような何かを試してみてください..私はあなたの副選択に参加を維持し、結果をフィルタリングするためのより読みやすいと思います...アウタージョイン使用した場合、where句を追加しないと思います
select sc.comment_id, 
     sc.commenter_id, 
     ss.section_name, 
     sc.comment, 
     sc.solution_part, 
     ss.display_order, 
     ss.solution_section_id, 
     sc.suggested_solution_id, 
     DAYOFMONTH(sc.date), 
     DAYNAME(sc.date), 
     YEAR(sc.date), 
     MONTH(sc.date), 
     u.first_name, 
     u.last_name, 
     u.email, 
     mp.small_thumb, 
     mp.mid_thumb 
from solution_sections ss 
left outer join suggested_solution_comments sc on ss.solution_section_id = sc.solution_part 
               AND sc.suggested_solution_id = 61 
left outer join users u on sc.commenter_id = u.user_id 
left outer join member_photo mp on sc.commenter_id = mp.member_id 
order by solution_section_id, 
     comment_id, 
     section_name, 
     comment, 
     solution_part, 
     display_order; 
+0

"すべての配布されたテーブルには別のエイリアスが必要です"というエラーメッセージが表示されました – GeekedOut

+0

これはテーブルエイリアスを除いて私のオリジナルとまったく同じですか? – GeekedOut

+0

おっと、もう一度やり直してください。 – StevieG

1

あなたがsolution_sectionsを表示したい場合は、すべての残りの部分が存在しない場合でも、あなたは「参加外を左」を使用することができます

select comment_id,commenter_id, section_name, comment, solution_part, 
    display_order, solution_section_id, suggested_solution_id, 
    DAYOFMONTH(date), DAYNAME(date), YEAR(date), MONTH(date), 
    first_name, last_name, email, small_thumb,mid_thumb 
from solution_sections 
left outer join suggested_solution_comments on solution_sections.solution_section_id = suggested_solution_comments.solution_part 
    and suggested_solution_id = 61 
left outer join users on suggested_solution_comments.commenter_id = users.user_id 
left outer join member_photo on suggested_solution_comments.commenter_id = member_photo.member_id 
where solution_section_id = ???? 
order by solution_section_id, comment_id, section_name, comment, solution_part,display_order; 

PSを。

+0

ありがとうございます - あなたはそれが外部結合の含意であることを私に思い出させることができますか?長い時間それらを使用していない笑 – GeekedOut

+0

は、外部結合ソリューションを試しただけで、それでも残念なことに動作しませんでした – GeekedOut

+1

['left join'と' left outer join'は同じものです](http://stackoverflow.com/questions/406294/left-join-and-left-outer-join-in-sql-server) –