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;

对于第二个 select 语句的所有值,我的结果都返回 null。我感觉这与第二个 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 回答