搜尋

首頁  >  問答  >  主體

php - mysql多表查詢

有這麼兩張表,大致描述一下。

表一:
課程與學生的關係表r
sid cid
1 | 1
1 | 2

學號為1 的選了cid 為1 ,和2 的課程

表二:
課程的具體時間表d
cid day start end
1 | 2 | 14 | 16
2 | 2 | 13 | 15

課程cid 為1 在周2 14點-16點

另外還有,學生表s,sid sname。課程表c,cid cname

這裡從r和d可以看出1 這位學生選了兩門有衝突的課程。怎麼用sql 語句查詢出這種衝突的記錄呢?
也就是一個學生 sid 選擇了時間衝突的 cid 的記錄呢?

用連結可以查詢出 sid 對應的cid 和對應的時間 ,然後怎麼判斷課程是否在時間上衝突呢?

附:這個問題的場景是一個題目集上看到的,我也同意選課的時候做判斷

滿天的星座滿天的星座2743 天前771

全部回覆(3)我來回復

  • 阿神

    阿神2017-05-25 15:10:10

    這個很好解決:

    1. 查出這個學生報名的所有的課程

    2. 檢測這些課程的時間上是否衝突

      • 看是不是在同一天,同一天的就比對開始和結束時間有沒有衝突,交集

      • 不是同一天的就沒問題

    補充:

    不過這個問題,應該是在報名時就要規避的,就不允許產生衝突。

    報名時檢測他所報名的課程時間與已經報名的課程有沒有時間衝突,有衝突就不允許報名。

    至於在時間軸上面比較兩個時間段是否有衝突其實也很好算的

    A - B, C - D

    A - C - B 或 A - D - B

    C - A - D 或 C - B - D

    四種情況會有交集,表示時間衝突了。

    回覆
    0
  • 巴扎黑

    巴扎黑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)

    這樣查出來的是在當天,該時間段內是否有選中的課程存在,這樣,如果有結果,則表示你選的這個課程和你報名的課程時間上有衝突

    回覆
    0
  • 習慣沉默

    習慣沉默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)

    回覆
    0
  • 取消回覆