mysql - 选择与另一个表中的字段相关的条目
问题描述
我有以下表格,Table1 显示所有用户,Table2 显示师生关系:
表1(用户):
ID name age
-------------
1 Al 30
2 Bob 5
3 Cam 6
4 Dan 7
表2(类):
teacher_id student_id
----------------------
1 2
1 3
本质上,这表明 Al (id=1) 是 Bob (id=2) 和 Cam (id=3) 的老师。我想返回教师和他的学生的用户行。例如,如果我正在寻找 Al (id=1),我想返回 Al 和他的学生(Bob 和 Cam)的用户信息。我想的是
SELECT * FROM users
LEFT JOIN classes ON users.id=classes.teacher_id
WHERE id=1 OR teacher_id=1
但我知道这一定是错误的,因为“teacher_id=1”没有从 classes.student_id 中获取值。它应该是“... WHERE id={the student_id's from classes where teacher_id=1}”。你怎么做到这一点?
解决方案
您可以使用这样的查询来显示学生按教师姓名搜索。
SELECT u.* FROM users u
where u.id IN (
SELECT t.student_id
FROM classes t
LEFT JOIN users tu ON t.`teacher_id` = tu.id
WHERE tu.name = 'Al'
);
样本
MariaDB [bernd]> SELECT * from users;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | Al | 30 |
| 2 | Bob | 5 |
| 3 | Cam | 6 |
| 4 | Dan | 7 |
+----+------+------+
4 rows in set (0.00 sec)
MariaDB [bernd]> SELECT * FROM classes;
+----+------------+------------+
| id | teacher_id | student_id |
+----+------------+------------+
| 1 | 1 | 2 |
| 2 | 1 | 3 |
+----+------------+------------+
2 rows in set (0.00 sec)
MariaDB [bernd]> SELECT u.* FROM users u
-> where u.id IN (
-> SELECT t.student_id
-> FROM classes t
-> LEFT JOIN users tu ON t.`teacher_id` = tu.id
-> WHERE tu.name = 'Al'
-> );
+----+------+------+
| id | name | age |
+----+------+------+
| 2 | Bob | 5 |
| 3 | Cam | 6 |
+----+------+------+
2 rows in set (0.00 sec)
MariaDB [bernd]>
推荐阅读
- r - 如何从 googlesheets4 的下拉列表中读取数据?
- css - 如何删除 CSS Grid 中未使用的列/行
- android - Kotlin Flow:当 Fragment 变得不可见时取消订阅 SharedFlow
- c++ - 复数分配似乎不再起作用
- ruby - 红宝石中这是什么?没有大括号的哈希?
- javascript - 什么是 JavaScript 中的“你的存在”API?
- python - 如何使用apply一次创建多个列?
- image-processing - 主动 vs. 专注 vs. 机器视觉
- c++ - c++中的转换器扩展
- django-rest-framework - 如何在POST请求中通过邮递员发送数组