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查询加入,比较两个表并返回第一个表中的所有记录的主要内容,如果未能解决你的问题,请参考以下文章