我有3个表,student,role,student-role(仅具有学生ID和角色ID)。我想通过检查学生姓名(在学生表中)来返回角色(在角色表中)。
我尝试过:
select role from role rr
join student-role sr on sr.role-id=rr role-id
join student ss on sr.student-id=ss.student-id
where ss.name="xxx"
我的表是:
Role
Role-id | Role |
-------------+---------------+
1 | admin |
2 | whatever |
Student
Student-id | name |
-------------+---------------+
1 | aaaaaaaa |
2 | bbbbbbbb |
Studnet-role
id | Role-id |student-id |
-------------+---------------+--------------+
1 | 1 |2 |
2 | 2 |1 |
有人能告诉我这是否正确吗?
答案 0 :(得分:2)
您的查询看起来正确。
我只是将其修改为以student
开头,然后从那里连接到其他表:
SELECT r.role
FROM student s
INNER JOIN `student-role` sr ON sr.`student-id` = s.`student-id`
INNER JOIN role r ON r.`role-id` = sr.`role-id`
WHERE (s.name = "xxx")
当然,如果一个student
有多个role
,那么您将通过此查询返回多行。您可能没想到。
偶然地,我建议您在列名中不要使用连字符(-
)。
编辑
在@Strawberry的评论之后,我在列名称中添加了反引号。当然,student-id
不是没有反引号的有效列名。
答案 1 :(得分:0)
我已经修改了列名和表以清楚理解。
create table role (role_id integer, role varchar(100));
create table std (std_id integer, name varchar(100));
create table std_role (id integer, role_id integer , std_id integer);
insert into role (role_id, role) values(1, "admin");
insert into role (role_id, role) values(2, "whatever");
insert into std (std_id, name) values(1, "aaaa");
insert into std (std_id, name) values(2, "bbbb");
insert into std_role (id,role_id,std_id) values(1,1,2);
insert into std_role (id,role_id,std_id) values(1,2,1);
SELECT role.* FROM std_role
INNER JOIN std ON (std.std_id=std_role.std_id)
INNER JOIN role ON (role.role_id=std_role.role_id)
WHERE std.name = 'aaaa';