【问题标题】:mysql query to join, compare two tables and return all records in first tablemysql查询加入,比较两个表并返回第一个表中的所有记录
【发布时间】:2019-07-18 21:10:37
【问题描述】:

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

我的主要目的是检查学生是否已经注册了课程,如果是,我会显示一些东西来表明。下面是我的表结构和我所做的尝试。

课程

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

学生课程

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              

【问题讨论】:

  • 将 WHERE 更改为 AND

标签: mysql sql outer-join


【解决方案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);

【讨论】:

  • 请问我如何使用 where 子句来检查个别学生?当我添加 WHERE student_courses.student_id = 'peter123' 它只返回 3 个项目
【解决方案2】:

你可以使用

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  

你的第二个问题我不明白

【讨论】:

  • 我尝试了您的示例并且它有效,但是我如何在我的 php 代码中获取 Enrolled 的值?
  • 这取决于您使用的是 mysqli 还是 pdo。看这里这对熟练的stackoverflow.com/questions/11575432/…来说很简单
【解决方案3】:

您需要将条件从 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 来完成这项工作,但我认为在您发布的示例数据中,2 列错误地分配给了该数据。如果是这种情况,请更改为ON cs.course_code = scs.course_codes
请参阅demo
结果:

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

【讨论】:

  • 我已经尝试过你的答案并且它有效,但是从我的代码中获取它时遇到问题是否可以分配ischeck AS 'enrolled',以便我可以检查if($row->ischeck == 'enrolled')
  • 当我打印出返回的对象时,我得到了类似(object) array( 'courses_name' => 'English Language', 'courses_code' => 'ENG101', 'case when scs.student_id is not null then \'ENROLLED\' end' => 'ENROLLED', ) 我真的不明白如何从我的 php 访问它
  • 我在查询中添加了别名ischeck
猜你喜欢
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多