来自4个表的复杂mysql查询

时间:2017-03-16 18:08:01

标签: php mysql sql join

表1 - 课程

course_id
name
category_id
status

表2 - 类别

category_id
category_name

表3 - 教授

prof_id
prof_name

表4 - COURSEANDPROF (课程和教授关系表,每门课程可以有多位教授)

id
course_id
professor_id

我在我的页面中创建两个选择来过滤我学校的课程,我没有问题为类别设置where子句:

if ($_POST['category']) {
    $category = "AND courses.category_id = ".$_POST['category'];
}

select courses.*,category.name from courses INNER JOIN category ON courses.category_id = category.category_id where courses.status = 1 ".$categoria

如果每门课程都有一位以上的教授,我如何才能在教授的位置上找到?

例如:

Course: Learn Jquery
Category: Javascript
Professors: Kevin Smith, Sara Logan

表课程

course_id  | name         | category_id   | status
--------------------------------------------------------
1          | Learn Jquery | 1             | 1
2          | Learn Mysql  | 3             | 0

表类别

category_id  | name     
------------------------
1            | Javascript 
3            | Database   

表教授

prof_id   | name     
------------------------
12        | Kevin Smith 
33        | Mike White
34        | Sara Logan   

表课程和个人资料

id   | course_id  |  professor_id
-----------------------------------
12   | 1          | 12
33   | 1          | 34
34   | 2          | 33

我需要按类别或/和教授过滤。

2 个答案:

答案 0 :(得分:1)

我会使用这个SQL代码:

SELECT courses.course_id AS course_id, courses.name AS course_name, 
    category.name AS category_name, 
    GROUP_CONCAT(DISTINCT professor.name SEPARATOR ', ') AS professor_name
FROM courses 
    LEFT JOIN category ON category.category_id = courses.category_id
    LEFT JOIN courseandprof ON courseandprof.course_id = courses.course_id
    LEFT JOIN professor ON professor.prof_id = courseandprof.professor_id
WHERE courses.status = 1
GROUP BY courses.course_id;

除了WHERE子句,您可以将其他过滤器放在那里,例如。 professor.prof_id = 12category.category_id = 1

如果一门课程有多位教授,这个查询会显示一行课程,并且连接教授的", "分隔符。

course_name: "Learn Jquery"
category_name: "Javascript"
professor_name: "Kevin Smith, Sara Logan"

要查询的主表格为courses。然后我们离开了加入categorycourseandprofprofessor表。如果通过courseandprof表将相同的课程与多位教授相关联,则会显示每个课程的多行。这就是为什么我们需要按程序对它进行分组(使用course_id),然后我们在SELECT子句中连接教授名称。

答案 1 :(得分:0)

您可以创建一个请求:

    SELECT c.category_id, c.category_name, co.course_id, cp.professor_id,  p.prof_name
FROM  `category` AS c
  INNER JOIN `course`  as co ON c.category_id = co.category_id
  INNER JOIN `courseandprof`   as cp ON  co.course_id = cp.course_id
  INNER JOIN `professor`    as p ON  p.prof_id = cp.professor_id
  WHERE  c.category_id = 1

您将category_id设置为此请求