recherche

Maison  >  Questions et réponses  >  le corps du texte

php - requête multi-tables mysql

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

.
滿天的星座滿天的星座2746 Il y a quelques jours774

répondre à tous(3)je répondrai

  • 阿神

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

    C'est facile à résoudre :

    1. Découvrez tous les cours auxquels cet étudiant s'est inscrit

    2. 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.

    répondre
    0
  • 巴扎黑

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

    .

    répondre
    0
  • 習慣沉默

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

    répondre
    0
  • Annulerrépondre