mysql查询加入,比较两个表并返回第一个表中的所有记录

时间:2019-07-18 21:10:37

标签: mysql sql outer-join

Am试图比较两个不同表中的数据,方法是返回第一个表中的所有数据,然后选择第二个表中的可用数据(如果有的话)。

我的主要目的是检查学生是否已注册课程,如果可以,我将显示一些要指示的内容。下面是我的表结构和尝试。

课程

course_name             |   course_code
------------------------|---------------------------------
VUE                     | VUE101
OBJECTIVE C             | OBJ101
Java                    | JAVA1
PHP                     | PHP101
HTML                    | HTML5
PYTHON                  | PYT101
SWIFT                   | SWT101
SQL                     | SQL101
HACKZA                  |HK101

student_courses

course_codes        |   student_id
--------------------|---------------------------
VUE                 |   peter123
SWIFT               |   peter123
SQL                 |   peter123

/ 尝试的SQL查询 /

//Query One
SELECT * FROM  courses cs
LEFT OUTER JOIN student_courses scs
ON cs.course_code = scs.course_codes
WHERE scs.student_id = 'peter123'

//Query Two
SELECT * FROM  courses cs
LEFT OUTER JOIN student_courses scs
ON cs.course_code = scs.course_codes
WHERE scs.student_id = 'john123'

/*//PHP Example
foreach($result as $row){
    if($row->course_code == $row->course_codes){
        echo $row->course_code . ' ENROLLED'
    }else{
        echo $row->course_code;
    }
}*/

/ 预期结果查询一次 /

VUE                     ENROLLED
OBJECTIVE C 
Java                        
PHP                     
HTML                    
PYTHON              
SWIFT                   ENROLLED
SQL                     ENROLLED
HACKZA              

/ 预期结果查询二 /

VUE                     
OBJECTIVE C 
Java                        
PHP                     
HTML                    
PYTHON              
SWIFT                   
SQL                     
HACKZA              

3 个答案:

答案 0 :(得分:1)

您只需一个查询就可以实现。

SELECT course_code,  
CASE WHEN course_codes != '' THEN 'ENROLLED' ELSE '' END AS STS
FROM courses
LEFT JOIN student_courses ON (student_courses.course_codes = courses.course_code);

答案 1 :(得分:1)

您可以使用

Select course_name, 
CASE WhEN course_name in (
 Select course_codes From student_courses where student_id = 'peter123') Then 'Enrolled' 
 ElSE ''
 End 
 From courses;

接收

VUE            Enrolled
OBJECTIVE C     
Java    
PHP     
HTML    
PYTHON  
SWIFT          Enrolled
SQL            Enrolled
HACKZA  

您不了解的第二个查询

答案 2 :(得分:0)

您需要将条件从WHERE移到ON子句:

SELECT 
  cs.course_name,
  case when scs.student_id is not null then 'ENROLLED' end AS ischeck 
FROM  courses cs
LEFT OUTER JOIN student_courses scs
ON cs.course_name = scs.course_codes AND scs.student_id = 'peter123'

我加入cs.course_name而不是cs.course_code来完成这项工作,但是我认为在您发布的样本数据中,错误地将两列分配给了该数据。如果是这种情况,请更改为ON cs.course_code = scs.course_codes
请参见demo
结果:

| course_name | ischeck  |
| ----------- | -------- |
| VUE         | ENROLLED |
| SWIFT       | ENROLLED |
| SQL         | ENROLLED |
| OBJECTIVE C |          |
| Java        |          |
| PHP         |          |
| HTML        |          |
| PYTHON      |          |
| HACKZA      |          |