成绩表A 学生表B 班级表C 学生职位表D 成绩关联关系表E(决定哪些学生可以查阅成绩) 学生与职位关系表F
A表 包含B.id
B表包含 C.ID
E表字段 A.ID B.ID C.ID D.ID 成绩一对多
根据E表维护的额关系,如果查阅人是本人、属于学生会主席职位、本班学生、E表存在得学生id,返回结果为学生可以查阅得所有成绩单,
能否提供表结构?
你这思路本身就有问题
你搞sql查询就一门心思搞sql,不想想如果从用户的角度看应该是个什么样的吗
如果是学生会主席,他可以看所有人的成绩,但是肯定不是一下子所有人的成绩都冒出来,而是先列一张表,里面是按科目,或者按学生,点进去,再出明细,全罗列在一起没眼看
自己的成绩到还好,反正没多少
SELECT A.*
FROM 成绩表A A
JOIN 学生表B B ON A.B_ID = B.ID
JOIN 班级表C C ON B.C_ID = C.ID
JOIN 学生职位表D D ON C.D_ID = D.ID
JOIN 成绩关联关系表E E ON A.ID = E.A_ID AND B.ID = E.B_ID AND C.ID = E.C_ID AND D.ID = E.D_ID
JOIN 学生与职位关系表F F ON B.ID = F.B_ID
WHERE (B.ID = :student_id OR D.职位 = '学生会主席' OR C.ID = :class_id OR F.D_ID IN (SELECT D_ID FROM 成绩关联关系表E WHERE B_ID = :student_id))
全部放一起是比较复杂,可以分开来查,再union起来,其实没太懂你的意思,是要所有条件都满足吗,还是每个条件分开,可以根据这个改一改
-- 本人成绩
select A.* from A where A.BID = '查询的学生ID'
union
-- 如果是学生会主席则可查询所有的成绩
select A.* from A
where EXISTS (
select * from B
left join F on F.BID = B.ID
where F.ZW = '学生会主席职位'
)
union
-- 查询本班学生成绩
select A.* from A
left join B on B.ID = A.BID
left join C on C.ID = B.CID
where C.ID = (
select C.ID from B left join C on C.ID = B.CID
where B.ID = '查询的学生ID'
)
union
-- 查询E表存在的学生ID(没太懂意思,是E表有个字段定义了可以查询学生的ID吗,下面的E.BID对应着变就行)
select A.* from E left join A on E.AID = A.ID where E.BID = '查询的学生ID'
SELECT A.*
FROM 成绩表A A
JOIN 学生表B B ON A.B_ID = B.ID
JOIN 班级表C C ON B.C_ID = C.ID
JOIN 学生职位表D D ON A.D_ID = D.ID
JOIN 学生与职位关系表F F ON B.ID = F.B_ID AND F.D_ID IN (1, 2)
JOIN 成绩关联关系表E E ON A.ID = E.A_ID AND E.B_ID = B.ID AND E.C_ID = C.ID AND E.D_ID = D.ID
WHERE B.ID = ? OR D.ID = 1 OR C.ID = ? OR E.B_ID = ?
? 表示参数占位符,需要替换成具体的值。这里的参数分别对应本人、本班学生、属于学生会主席职位的学生。
你说的太模糊了,几个关键的字段都没给