Rumah > Soal Jawab > teks badan
Ada dua jadual, terangkan secara ringkas.
Jadual 1:
Jadual hubungan antara kursus dan pelajar
sid cid
1 | 1
1 | 2
Pelajar nombor 1 telah memilih kursus dengan cid 1 dan 2
Jadual 2:
Jadual kursus khusus d
hari cid mula tamat
1 | 2 | 14 | 16
2 | 2 | 13 | 15
Kursus cid ialah 1 pada hari Selasa 14:00-16:00
Selain itu, terdapat meja pelajar s, sid sname. Jadual kursus c, cid cname
Di sini dapat dilihat daripada r dan d bahawa 1 pelajar ini telah memilih dua kursus yang bercanggah. Bagaimana untuk menggunakan pernyataan sql untuk menanyakan rekod bercanggah tersebut?
Maksudnya, bagaimana dengan rekod seorang pelajar sid memilih cid yang bercanggah masa?
Anda boleh menggunakan sambungan untuk menanyakan cid yang sepadan dengan sid dan masa yang sepadan Kemudian bagaimana untuk menentukan sama ada kursus bercanggah dalam masa?
Lampiran: Senario soalan ini dilihat dalam set soalan Saya juga bersetuju dengan pertimbangan semasa memilih kursus
阿神2017-05-25 15:10:10
Ini mudah untuk diselesaikan:
Ketahui semua kursus yang pelajar ini telah mendaftar
Semak sama ada terdapat sebarang konflik dalam masa kursus ini
Semak untuk melihat sama ada mereka berada pada hari yang sama Jika mereka berada pada hari yang sama, bandingkan masa mula dan tamat untuk melihat jika terdapat sebarang konflik atau pertindihan
Tiada masalah jika mereka tidak berada pada hari yang sama
Ditambah:
Namun, masalah ini harus dielakkan semasa mendaftar, dan tiada konflik dibenarkan.
Semasa mendaftar, semak sama ada terdapat percanggahan masa antara masa kursus yang dia telah daftar dan kursus yang telah dia daftarkan Jika ada konflik, pendaftaran tidak akan dibenarkan.
Untuk membandingkan dua tempoh masa pada garis masa untuk melihat jika terdapat sebarang konflik, ia sebenarnya mudah untuk dikira
A - B, C - D
A - C - B atau A - D - B
C - A - D atau C - B - D
Akan terdapat persimpangan antara empat situasi, menunjukkan konflik masa.
巴扎黑2017-05-25 15:10:10
Sebenarnya, saya berpendapat bahawa kursus yang bercanggah sebegini harus dinilai apabila pelajar memilih kursus, dan ia tidak sepatutnya ditambahkan pada pangkalan data
Kaedah:
Setiap kali pelajar memilih kursus, mula-mula gunakan masa kursus yang dipilih untuk bertanya sama ada data bercanggah semasa sudah wujud dalam pangkalan data
Contohnya:
Jika pelajar dengan sid = 1 telah memilih kursus dengan cid = 1, dan kemudian apabila memilih kursus dengan cid = 2, sql akan menjadi seperti berikut:
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)
Perkara yang anda semak ialah sama ada terdapat kursus yang dipilih dalam tempoh masa tersebut pada hari tersebut Jika ada keputusan, bermakna masa kursus yang anda pilih bercanggah dengan kursus yang anda daftarkan #🎜🎜. #
習慣沉默2017-05-25 15:10:10
Masalah sebegini boleh diselesaikan dengan penyambungan diri.
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)