2

大学のデータベースにコースの名前とその前提条件(ある場合)をリストしようとしています。これらのテーブルのスキーマは次のようになります

course(course_id, title, dept_name, credits)
prereq(course_id, prereq_id)

これは私の質問です

SELECT title, (SELECT title
              FROM course NATURAL JOIN prereq c2
              WHERE c1.prereq_id = c2.course_id)
FROM course NATURAL LEFT JOIN prereq c1;

私の結果は、2番目のselectステートメントのすべての値に対してnullを返しています。2番目のselectステートメントの時点でc1の値がわからないことと関係があると感じています。これを回避する方法、または使用できるより良いクエリはありますか?

4

2 に答える 2

1

大学のデータベースにコースの名前とその前提条件(ある場合)をリストしようとしています。

代わりにこれを行うことができます:

SELECT 
  c1.title "Course Title",
  IFNULL(c2.title, "Has No Preqs") "Preq Course Title"
FROM course c1
LEFT JOIN prereq p ON p.course_id = c1.course_id
LEFT JOIN course c2 ON p.prereq_id= c2.course_id

SQLフィドルデモ

ただし、どのコースにも多くの前提条件のコースがある場合、これは機能しません。

この場合GROUP_CONCAT、@ danihpが彼の回答で次のように指摘したように、使用する必要があります。

SELECT 
  c1.title "Course Title",
  GROUP_CONCAT(IFNULL(c2.title, "Has No Preqs")) "Preq Course Title"
FROM course c1
LEFT JOIN prereq p ON p.course_id = c1.course_id
LEFT JOIN course c2 ON p.prereq_id= c2.course_id
GROUP BY c1.title ;

SQLフィドルデモ

于 2012-11-20T08:15:40.177 に答える
1

group_concat集計関数を探しています:

SELECT 
   title,  
   group_concat( distinct c2.title ) as prereqs
FROM course 
NATURAL LEFT JOIN prereq c1
left outer join course c2 on c1.course_id = c2.course_id
group by course.course_id;
于 2012-11-20T08:15:40.967 に答える