Galère requête MySQL

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!
 

Sebulba

Dieu
Staff
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...
 
1er
OP
Ch3at4h

Ch3at4h

BabeZ master
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...
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 :)
 

Sigmund

Philololologue
"pour chaque student, si activité x a une end _hour < start_hour de activité y" ?

Ou tu veux le SQL?
 
1er
OP
Ch3at4h

Ch3at4h

BabeZ master
Mmmmh tu viens de me faire penser à quelque chose, je teste illico. Merci!
 

DaBeast

Elite
n'oublie pas de rajouter que ton day doit etre la meme chose aussi ...
 
1er
OP
Ch3at4h

Ch3at4h

BabeZ master
n'oublie pas de rajouter que ton day doit etre la meme chose aussi ...
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!
 

gregsting

Chat!
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.
 
1er
OP
Ch3at4h

Ch3at4h

BabeZ master
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.
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'];
        }
    }
}
 

eGm_

Gibon Blasé
ca n'existe pas l'inner join en MySQL ? :burp:
 

titoum

OPTC:970342646
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
 

eGm_

Gibon Blasé
o_O
 
1er
OP
Ch3at4h

Ch3at4h

BabeZ master
titoum ouhla ! Next level ici :D
Je teste ça demain, merci!
 

titoum

OPTC:970342646
titoum ouhla ! Next level ici :D
Je teste ça demain, merci!
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.
 

gregsting

Chat!
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!
 

titoum

OPTC:970342646
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
 
Haut