[請益] sql 語法邏輯問題

看板PHP作者 (adam)時間16年前 (2009/05/20 13:44), 編輯推噓4(4011)
留言15則, 3人參與, 最新討論串1/1
我自己試著做一個選課系統 查詢課程時間時發生問題 希望能夠找出選的課 1. 自己已選的課沒有重複 2. 時間不會重疊 $sql = " select c.course_id from course as c where c.course_id = '$course_add' and c.course_id not in ( select distinct c1.course_id from course as c1,course_taking_association as ctawhere cta.student_id = '$input_account_no' and c1.course_id = cta.course_id ) -------到這裡之前可以正確找別重複的--------------- ------------------------------------------------- 以下為出現問題的程式碼的想法 and ( ( 與自己已有的課程同一天 and( ( 已有課程的時間開頭>=現在選課的時間結尾 and 已有課程的時間結尾>=現在選課的時間結尾 ) or ( 已有課程的時間開頭<=現在選課的時間開頭 and 已有課程的時間結尾<=現在選課的時間開頭 ) ) ) or ( 與自己已有的課程不同天 ) ) ---------以下就是加入後會沒東西出現的程式碼-------------------------------- and c.course_id in ( select distinct c2.course_id from course as c2,course_taking_association as cta1 where cta1.student_id = '$input_account_no' and c2.course_id = cta1.course_id and ( ( SUBSTRING_INDEX(c2.time,SUBSTRING_INDEX(SUBSTRING_INDEX(c2.time,':',1),')',-1),1) = '$day' and ( SUBSTRING_INDEX(SUBSTRING_INDEX(c2.time,':',1),')',-1)>='$end' and SUBSTRING_INDEX(SUBSTRING_INDEX(c2.time,':',2),'~',-1)>='$end' ) or ( SUBSTRING_INDEX(SUBSTRING_INDEX(c2.time,':',1),')',-1)<='$begin' and SUBSTRING_INDEX(SUBSTRING_INDEX(c2.time,':',2),'~',-1)<='$begin' ) ) or ( SUBSTRING_INDEX(c.time,SUBSTRING_INDEX(SUBSTRING_INDEX(c2.time,':',1),')',-1),1) != '$day' ) ) ) "; 麻煩各位給個提示吧 我弄很久,但就是出不來 感恩~ -- 寂寞背後的曙光 是看著被壞男人牽著走的愛人 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.122.198.249 ※ 編輯: adam0806 來自: 140.122.198.249 (05/20 13:46)

05/20 16:05, , 1F
提示: 應該是不用這麼複雜才對. 要看資料庫設計的正
05/20 16:05, 1F

05/20 16:05, , 2F
規化有沒有處理好? 有的話程式處理起來應該很簡明.
05/20 16:05, 2F

05/20 16:31, , 3F
所以授課時間應該分開begin和end記錄囉?
05/20 16:31, 3F

05/20 16:33, , 4F
不,授課時間要在一起.是'學生','課程','選課記錄'要
05/20 16:33, 4F

05/20 16:33, , 5F
拆表才對.
05/20 16:33, 5F

05/20 16:34, , 6F
我這樣講只是輪廓,實際上要case by case下去看才準.
05/20 16:34, 6F

05/20 19:08, , 7F
我有把學生,課程拆開
05/20 19:08, 7F

05/20 19:08, , 8F
選課紀錄是用學生的帳號,課程id下去連結的
05/20 19:08, 8F

05/20 21:11, , 9F
我了解你的意思了,table設計沒問題,主要是檢查有沒有
05/20 21:11, 9F

05/20 21:11, , 10F
衝堂?
05/20 21:11, 10F

05/20 21:15, , 11F
或許可以透過下sql條件檢查,只是我也不熟如何下?我會
05/20 21:15, 11F

05/20 21:15, , 12F
把該生所有選的課撈出來用php程式來檢查.
05/20 21:15, 12F

05/20 21:18, , 13F
透過一個迴圈來檢查所有所選課的時段是否有重疊到.
05/20 21:18, 13F

05/23 08:27, , 14F
我也建議資料撈出來後再用程式檢察
05/23 08:27, 14F

05/25 22:24, , 15F
謝謝各位的回答
05/25 22:24, 15F
文章代碼(AID): #1A4vZ9xu (PHP)
文章代碼(AID): #1A4vZ9xu (PHP)