Maison > Questions et réponses > le corps du texte
Il y a deux tableaux, décrivez-les brièvement.
Tableau 1 :
Tableau des relations entre cours et étudiants
sid cid
1 | 1
1 | 2
L'étudiant numéro 1 a choisi des cours avec cid 1 et 2
Tableau 2 :
Horaire spécifique des cours d
cid journée début fin
1 | 2 | 14 | 16
2 | 2 | 13 | 15
Le cid du cours est 1 le mardi de 14h00 à 16h00
En plus, il y a la table des étudiants, sid sname. Horaire des cours c, cid cname
Ici, on peut voir d'après r et d que 1 cet étudiant a choisi deux cours contradictoires. Comment utiliser l'instruction SQL pour interroger de tels enregistrements contradictoires ?
Autrement dit, qu'en est-il du dossier d'un étudiant choisissant un cid avec une heure conflictuelle ?
Vous pouvez utiliser la connexion pour interroger le cid correspondant au sid et l'heure correspondante. Alors comment déterminer si les cours sont en conflit dans le temps ?
Pièce jointe : le scénario de cette question est ce que j'ai vu dans un ensemble de questions. Je suis également d'accord avec le fait de porter des jugements lors du choix des cours
.阿神2017-05-25 15:10:10
C'est facile à résoudre :
Découvrez tous les cours auxquels cet étudiant s'est inscrit
Vérifiez s'il y a des conflits dans le temps de ces cours
Vérifiez s'ils sont le même jour, s'ils sont le même jour, comparez les heures de début et de fin pour voir s'il y a un conflit
Ce n'est pas grave s'ils ne sont pas le même jour
Supplément :
Cependant, ce problème doit être évité lors de l'inscription, et les conflits ne seront pas autorisés.
Lors de votre inscription, vérifiez s'il y a un conflit horaire entre l'heure du cours auquel il s'est inscrit et les cours auxquels il s'est déjà inscrit. En cas de conflit, l'inscription ne sera pas autorisée.
Quant à comparer deux périodes sur la chronologie pour voir s'il y a un conflit, il est en fait facile de calculer
A - B, C - D
A - C - B ou A - D - B
C - A - D ou C - B - D
Il y aura une intersection entre les quatre situations, indiquant un conflit temporel.
巴扎黑2017-05-25 15:10:10
En fait, je pense que de tels cours contradictoires devraient être jugés lorsque les étudiants choisissent des cours, et ils ne devraient pas être ajoutés à la base de données
Méthode :
Chaque fois qu'un étudiant sélectionne un cours, utilisez d'abord l'heure du cours sélectionné pour demander si les données conflictuelles actuelles existent déjà dans la base de données
Par exemple :
Supposons qu'un étudiant avec sid = 1 ait choisi un cours avec cid = 1, puis lors du choix d'un cours avec cid = 2, le sql sera le suivant :
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)
Ce qui est vérifié, c'est s'il y a un cours sélectionné dans cette période ce jour-là. S'il y a un résultat, cela signifie que l'heure du cours que vous avez sélectionné est en conflit avec le cours auquel vous vous êtes inscrit
.習慣沉默2017-05-25 15:10:10
Ce genre de problème peut être résolu par l'auto-connexion.
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)