php - mysql多表查詢
問題描述
有這么兩張表,大致描述一下。
表一:課程和學(xué)生的關(guān)系表rsid cid1 | 11 | 2
學(xué)號為1 的選了cid 為1 ,和2 的課程
表二:課程的具體時(shí)間表dcid day start end 1 | 2 | 14 | 16 2 | 2 | 13 | 15
課程cid 為1 在周2 14點(diǎn)-16點(diǎn)
另外還有,學(xué)生表s,sid sname。 課程表c,cid cname
這里從r和d可以看出1 這個(gè)學(xué)生選了兩門有沖突的課程。怎么用sql 語句查詢出這種沖突的記錄呢?也就是一個(gè)學(xué)生 sid 選擇了時(shí)間沖突的 cid 的記錄呢?
用連接可以查詢出 sid 對應(yīng)的cid 和對應(yīng)的時(shí)間 ,然后怎么判斷課程是否在時(shí)間上沖突呢?
附:這個(gè)問題的場景是一個(gè)題目集上看到的,我也同意選課的時(shí)候做判斷
問題解答
回答1:這個(gè)很好解決:
查出這個(gè)學(xué)生報(bào)名的所有的課程
檢測這些課程的時(shí)間上是否沖突
看是不是在同一天,同一天的就比對開始和結(jié)束時(shí)間有沒有沖突,交集
不是同一天的就沒問題
補(bǔ)充:
不過這個(gè)問題,應(yīng)該是在報(bào)名時(shí)就要規(guī)避的,就不允許產(chǎn)生沖突。
報(bào)名時(shí)檢測他所報(bào)名的課程時(shí)間與已經(jīng)報(bào)名的課程有沒有時(shí)間沖突,有沖突就不允許報(bào)名。
至于在時(shí)間軸上面比較兩個(gè)時(shí)間段是否有沖突其實(shí)也很好算的
A - B, C - D
A - C - B 或者 A - D - B
C - A - D 或者 C - B - D
四種情況下會(huì)有交集,說明時(shí)間沖突了。
回答2:其實(shí),我覺得,這種有沖突的課程,在學(xué)生選課的時(shí)候就應(yīng)該做判斷,不應(yīng)該讓他加到數(shù)據(jù)庫當(dāng)中
方法:每次在學(xué)生選課的時(shí)候,先用選擇的這個(gè)課程的時(shí)間,去查詢數(shù)據(jù)庫里是否已經(jīng)存在當(dāng)前沖突的數(shù)據(jù)
例如:假如,sid = 1 的學(xué)生已經(jīng)選擇了cid = 1 的課程,然后在選擇 cid = 2 的課程時(shí),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)
這樣查出來的是在當(dāng)天,該時(shí)間段內(nèi)是否有選中的課程存在,這樣,如果有結(jié)果,則表示你選的這個(gè)課程和你報(bào)名的課程時(shí)間上有沖突
回答3:這種問題可以自連接解決。
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)
相關(guān)文章:
1. python3.x - python連oanda的模擬交易api獲取json問題第五問2. docker - 如何修改運(yùn)行中容器的配置3. nignx - docker內(nèi)nginx 80端口被占用4. 域名解析在Ubuntu64 9.04計(jì)算機(jī)上的Java應(yīng)用程序中不起作用所有其他軟件可以正確解析DNS5. java - SSH框架中寫分頁時(shí)service層中不能注入分頁類6. 關(guān)于docker下的nginx壓力測試7. 為什么我ping不通我的docker容器呢???8. javascript - js代碼獲取驗(yàn)證碼倒計(jì)時(shí)問題9. angular.js - angular內(nèi)容過長展開收起效果10. docker-machine添加一個(gè)已有的docker主機(jī)問題
