Heim > Fragen und Antworten > Hauptteil
Es gibt zwei Tabellen, beschreiben Sie sie kurz.
Tabelle 1:
Beziehungstabelle zwischen Kursen und Studierenden
sid cid
1 | 1
1 | 2
Student Nummer 1 hat Kurse mit den Kursen 1 und 2 gewählt
Tabelle 2:
Spezifischer Kursplan für jeden Tag, Beginn und Ende
1 | 2 | 14 | 16
2 | 2 | 13 | 15
Darüber hinaus gibt es den Schülertisch s, sid sname. Kursplan c, cid cname
Hier ist aus r und d ersichtlich, dass 1 dieser Student zwei widersprüchliche Kurse gewählt hat. Wie verwende ich eine SQL-Anweisung, um solche widersprüchlichen Datensätze abzufragen?
Das heißt, was ist mit der Bilanz eines Studenten, der sich für eine Cid mit widersprüchlicher Zeit entschieden hat?
Anhang: Das Szenario dieser Frage wurde in einem Fragensatz gesehen. Auch bei der Auswahl der Kurse stimme ich zu
阿神2017-05-25 15:10:10
这个很好解决:
查出这个学生报名的所有的课程
检测这些课程的时间上是否冲突
看是不是在同一天,同一天的就比对开始和结束时间有没有冲突,交集
不是同一天的就没问题
补充:
不过这个问题,应该是在报名时就要规避的,就不允许产生冲突。
报名时检测他所报名的课程时间与已经报名的课程有没有时间冲突,有冲突就不允许报名。
至于在时间轴上面比较两个时间段是否有冲突其实也很好算的
A - B, C - D
A - C - B 或者 A - D - B
C - A - D 或者 C - B - D
四种情况下会有交集,说明时间冲突了。
巴扎黑2017-05-25 15:10:10
其实,我觉得,这种有冲突的课程,在学生选课的时候就应该做判断,不应该让他加到数据库当中
方法:
每次在学生选课的时候,先用选择的这个课程的时间,去查询数据库里是否已经存在当前冲突的数据
例如:
假如,sid = 1 的学生已经选择了cid = 1 的课程,然后在选择 cid = 2 的课程时,sql如下:
select * from r left join d on r.cid = d.cid where d.day = 2 and (d.start between 13 and 15 or d.end between 13 and 15)
这样查出来的是在当天,该时间段内是否有选中的课程存在,这样,如果有结果,则表示你选的这个课程和你报名的课程时间上有冲突
習慣沉默2017-05-25 15:10:10
这种问题可以自连接解决。
select tmp1.sid,tmp1.cid,tmp2.cid
from
(select a.sid,a.cid,b.day,b.start,b.end from tbl1 a inner join tbl2 on a.cid=b.cid) tmp1
left join (select a.sid,a.cid,b.day,b.start,b.end from tbl1 a inner join tbl2 on a.cid=b.cid) tmp2
on tmp1.sid = tmp2.sid and tmp1.cid<>tmp2.cid and tmp1.day = tmp2.day
where (tmp1.start > tmp2.start and tmp1.start < tmp2.end)
or (tmp1.end > tmp2.end and tmp1.end < tmp2.end)