php – MySQL-Mehrtabellenabfrage
滿天的星座
滿天的星座 2017-05-25 15:08:10
0
3
762

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

Kursbeginn ist Dienstag 14:00-16:00 Uhr

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?

Über die Verbindung können Sie die der SID entsprechende CID und die entsprechende Zeit abfragen. Wie kann dann festgestellt werden, ob die Kurse zeitlich in Konflikt geraten?

Anhang: Das Szenario dieser Frage wurde in einem Fragensatz gesehen. Auch bei der Auswahl der Kurse stimme ich zu
滿天的星座
滿天的星座

Antworte allen(3)
阿神

这个很好解决:

  1. 查出这个学生报名的所有的课程

  2. 检测这些课程的时间上是否冲突

    • 看是不是在同一天,同一天的就比对开始和结束时间有没有冲突,交集

    • 不是同一天的就没问题

补充:

不过这个问题,应该是在报名时就要规避的,就不允许产生冲突。

报名时检测他所报名的课程时间与已经报名的课程有没有时间冲突,有冲突就不允许报名。

至于在时间轴上面比较两个时间段是否有冲突其实也很好算的

A - B, C - D

A - C - B 或者 A - D - B

C - A - D 或者 C - B - D

四种情况下会有交集,说明时间冲突了。

巴扎黑

其实,我觉得,这种有冲突的课程,在学生选课的时候就应该做判断,不应该让他加到数据库当中

方法:
每次在学生选课的时候,先用选择的这个课程的时间,去查询数据库里是否已经存在当前冲突的数据

例如:
假如,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)

这样查出来的是在当天,该时间段内是否有选中的课程存在,这样,如果有结果,则表示你选的这个课程和你报名的课程时间上有冲突

習慣沉默

这种问题可以自连接解决。

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)
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage