首页 > 解决方案 > 选择与另一个表中的字段相关的条目

问题描述

我有以下表格,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}”。你怎么做到这一点?

标签: mysql

解决方案


您可以使用这样的查询来显示学生按教师姓名搜索。

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]>

推荐阅读