Galère requête MySQL

Discussion dans 'Web, design' créé par Ch3at4h, 20 Septembre 2016.

  1. Online
    Ch3at4h BabeZ master
    Hello tout le monde! Je galère quelque peu sur l'écriture d'une bête query mais rien à faire ça ne veut pas passer.

    Je vous explique:

    Nous avons un catalogue d'activités parascolaires (table activity) qui regroupe toutes les activités que nous organisons. Certaines se chevauchent au niveau des horaires (reprises en jaunes) .
    alere1.PNG

    A côté de ça, nous avons les réservations pour ces activités (table ins_activity) dans laquelle je souhaiterais retrouver tous les élèves (id_eleve) qui participent à des activités qui se chevauchent (lignes jaunes).
    alère2.PNG

    Auriez-vous une p***in d'idée de comment formuler cette satanée requête pour obtenir les id_eleve participant à deux activités qui se chevauchent?

    Merci d'avance!
    Ch3at4h, 20 Septembre 2016
    #1
  2. Offline
    Sebulba Dieu
    Equipe GamerZ.be
    Deja avec des heures dans ce format je crois que tu peux oublier...

    Moi je remplacerai les X demi heure de la journée par un code chiffré ( 1-16 pour une joruéne de 8h) et la ya peut etre moyen de faire une query dessus...
    Sebulba, 20 Septembre 2016
    #2
  3. Online
    Ch3at4h BabeZ master
    hour_start et hour_end sont des champs TIME de MySQL, du coup les opérations mathématiques (<, >, =, !=) sont possibles dessus. Je ne vois pas en quoi le format est handicapant :oops:

    De plus vu le nombre de page impacté par un tel changement je t'avoue que je préférerais m'en passer :)
    Ch3at4h, 20 Septembre 2016
    #3
  4. Offline
    Sigmund Philololologue
    "pour chaque student, si activité x a une end _hour < start_hour de activité y" ?

    Ou tu veux le SQL?
    Sigmund, 20 Septembre 2016
    #4
  5. Online
    Ch3at4h BabeZ master
    Mmmmh tu viens de me faire penser à quelque chose, je teste illico. Merci!
    Ch3at4h, 20 Septembre 2016
    #5
  6. Offline
    DaBeast Elite
    n'oublie pas de rajouter que ton day doit etre la meme chose aussi ...
    DaBeast, 20 Septembre 2016
    #6
    Sigmund aime ça.
  7. Online
    Ch3at4h BabeZ master
    Yep, j'ai même commencé par là ;)
    Suis arrivé au résultat escompté (mais d'une manière un peu sale).
    Je viendrai poster la query quand j'aurai le temps de la cleaner un peu ^_^

    Merci!
    Ch3at4h, 20 Septembre 2016
    #7
  8. Offline
    gregsting Elite
    Je suis curieux de voir ta soluce... sinon moi je commencerais par faire une liste des events qui se chevauchent puis checker qu'on est pas dans cette liste.
    gregsting, 20 Septembre 2016
    #8
  9. Online
    Ch3at4h BabeZ master
    Bon, pataper c'est vraiment très sale !

    PHP:
    $query_eleves_lundi=mysql_query("SELECT DISTINCT ia.id_eleve FROM ins_activity ia, activity a WHERE ia.id_activity=a.id_activity AND a.day='1'");
    while (
    $eleves_lundi=mysql_fetch_array($query_eleves_lundi)) {
        
    $query_act_par_el_lundi=mysql_query("SELECT a.hour_start, a.hour_end FROM activity a, ins_activity ia WHERE ia.id_activity=a.id_activity AND a.day='1' ia.id_eleve='".$eleves_lundi['id_eleve']."'");
        
    $count_act_par_el_lundi=mysql_num_rows($query_act_par_el_lundi);
        if (
    $count_act_par_el_lundi!='1') {
            
    $res_prec='01:00:00';
            while (
    $act_par_el_lundi=mysql_fetch_array($query_act_par_el_lundi)) {
                if ((
    $res_prec!='01:00:00') && ($act_par_el_lundi['hour_end']>$res_prec)) {
                    echo 
    $eleves_lundi['id_eleve'];
                }
                
    $res_prec=$act_par_el_lundi['hour_start'];
            }
        }
    }
    Ch3at4h, 20 Septembre 2016
    #9
  10. Offline
    eGm_ Guinea Trump
    ca n'existe pas l'inner join en MySQL ? :burp:
    eGm_, 20 Septembre 2016
    #10
  11. Online
    Ch3at4h BabeZ master
    Si, mais comme j'ai dit c'est écrit à la va-vite et sale :D
    Ch3at4h, 20 Septembre 2016
    #11
    Thibz, Sigmund et YoupiDollarZ aiment ça.
  12. Offline
    eGm_ Guinea Trump
    Ouais mais quand même :p T'aurais pu faire une vue bien dégeux a la place déja :p
    eGm_, 20 Septembre 2016
    #12
  13. Online
    titoum GMZ Crew optc 970.342.646
    select * from id_eleve ie
    where ie.id_activity in (select id_activity
    from ins_activity iaa
    join ins_activity iab on iaa.id_activity = iab.id_activity
    where iab.hour_start between iaa.hour_start and iaa.hour_end
    and iaa.day=iab.day)

    bisous @Ch3at4h gingaillon :D

    edit: mieux avec le in
    titoum, 20 Septembre 2016
    #13
    xlr8 et Sebulba aiment ça.
  14. Offline
    eGm_ Guinea Trump
    o_O
    eGm_, 20 Septembre 2016
    #14
  15. Offline
    Sebulba Dieu
    Equipe GamerZ.be
    Sebulba, 20 Septembre 2016
    #15
  16. Online
    titoum GMZ Crew optc 970.342.646

    mais pas top qd meme pcq il faut check si il a les 2 activitées a son planning

    je vais voir ca si j arrete de tousser :eek:
    titoum, 20 Septembre 2016
    #16
  17. Online
    Ch3at4h BabeZ master
    @titoum ouhla ! Next level ici :D
    Je teste ça demain, merci!
    Ch3at4h, 20 Septembre 2016
    #17
  18. Online
    titoum GMZ Crew optc 970.342.646
    Code:
    select * from ins_activity ia
    where ia.ID_ACTIVITY in (
      select a.id_activity
      from activity a
      join activity ab on a.day=ab.day
      where a.HOUR_START between ab.HOUR_START and ab.HOUR_END
      and a.id_activity != ab.id_activity
      and a.id_activity = (select ID_ACTIVITY from ins_activity iab where iab.ID_ELEVE=ia.ID_ELEVE and iab.ID_ACTIVITY=a.id_activity)
      and ab.id_activity = (select ID_ACTIVITY from ins_activity iac where iac.ID_ELEVE=ia.ID_ELEVE and iac.ID_ACTIVITY=ab.id_activity)
      )
    celle-ci est correct, merci de m'avoir fait lancer vmware pour faire ton truc :pfrt::pfrt::pfrt::pfrt:

    tu me dois au moins trois tours en jeep sur battle field du coup ahahaha :cool::cool::cool::cool:

    la query te retournera pour CHAQUE overlaps l'id eleve + l'un des activity id. j'ai test avec 3 activity qui s'overlaps et j'ai bien deux rows retournée.
    titoum, 20 Septembre 2016
    #18
    Chamallow et xlr8 aiment ça.
  19. Offline
    gregsting Elite
    Est ce que ça risque pas de foirer si deux activités se suivent? Genre A de 12 à 13h et B de 13 à 14h? Car 13h est BETWEEN 12 et 13h

    Mais sinon, Nice!
    gregsting, 20 Septembre 2016
    #19
  20. Online
    titoum GMZ Crew optc 970.342.646
    na pcq 13:00 sera = a 13:00 et non pas < ou >

    maintenant, a voir si les activites sont sur le meme site pcq si tu as 5' pour t'y rendre :p
    titoum, 20 Septembre 2016
    #20