mysql查询加入,比较两个table和return中第一个table的所有记录
mysql query to join, compare two tables and return all records in first table
我正在尝试比较来自两个不同 table 的数据,方法是返回第一个 table 中的所有数据,然后返回第二个 table 中的 select 可用数据,如果有任何。
我的主要目的是检查学生是否已注册课程,如果是,我会显示一些内容以表明。下面是我的 table 结构和我所做的尝试。
课程
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
只需一个查询即可实现。
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);
您可以使用
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
你的第二个问题我没看懂
您需要将条件从 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 | |
我正在尝试比较来自两个不同 table 的数据,方法是返回第一个 table 中的所有数据,然后返回第二个 table 中的 select 可用数据,如果有任何。
我的主要目的是检查学生是否已注册课程,如果是,我会显示一些内容以表明。下面是我的 table 结构和我所做的尝试。
课程
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
只需一个查询即可实现。
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);
您可以使用
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
你的第二个问题我没看懂
您需要将条件从 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 | |