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

Posted

技术标签:

【中文标题】mysql查询加入,比较两个表并返回第一个表中的所有记录【英文标题】:mysql query to join, compare two tables and return all records in first table 【发布时间】: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 【参考方案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。看这里这对熟练的***.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

以上是关于mysql查询加入,比较两个表并返回第一个表中的所有记录的主要内容,如果未能解决你的问题,请参考以下文章

比较 2 个表并返回 MySQL 中的变化

Access - 比较两个表并在第一个表中更新或插入数据

加入两个表并获取最新的 slug

MySQL JOIN 2 个表并分别获取两个表的总和

连接两个表并从一列返回多个匹配项的 SQL 查询?

优化比较两个 MySQL 大表中的数据