IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

SELECT WHERE imbriqué ?


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut SELECT WHERE imbriqué ?
    Bonjour,

    J'ai une table mysql ressemblant à ceci (je n'ai laissé qu'une partie des champs, ceux susceptible d'être utilisés par la requête):

    begin (datetime), end(datetime), PI_begin (varchar), PI_end (varchar), duration (time)

    un petit exemple de ce qu'il pourrait y avoir en données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      begin              | end                 | PI_begin | PI_end   | duration
     2010-10-21 08:00:00 | 2010-10-21 08:30:00 | PI_00    | PI_01    | 01:30:00
     2010-10-21 10:00:00 | 2010-10-21 10:10:00 | PI_01    |          | 00:30:00
     2010-10-21 10:40:00 | 2010-10-21 10:50:00 |          |          | 00:15:00
     2010-10-21 11:05:00 | 2010-10-21 11:30:00 |          | PI_02    | 00:45:00
     2010-10-21 12:15:00 | 2010-10-21 12:30:00 | PI_02    | PI_03    | 01:00:00
     2010-10-21 13:30:00 | 2010-10-21 14:00:00 | PI_03    |          | 01:00:00
     2010-10-21 15:00:00 | 2010-10-21 15:10:00 |          | PI_04    | 00:30:00
     2010-10-21 15:40:00 | 2010-10-21 15:50:00 | PI_04    | PI_05    | 01:30:00
    ....
    Globalement
    begin = date de début,
    end = date de fin,
    PI_Begin peux etre NULL (excepté le premier de la journée) mais doit être égal au PI_END de la ligne précédente,
    PI_end peux etre NULL, à l'inverse il doit etre égal au PI_begin de la ligne suivante,
    duration est la durée entre le 'end' de la ligne précédente et le 'begin' de la ligne suivante.

    (Désolé, j'ai essayé de formater au mieux mon exemple).

    Mon but est de récupérer les lignes 4 ,5 ,6 ,8 ,9 dans l'exemple ci dessus.

    j'ai pour l'instant une requête de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM `matable` WHERE (DATE(begin) BETWEEN :date1 ANS :date2) AND (`PI_begin` == NULL OR `PI_end` == NULL)
    Jusque la pas de soucis, sauf que j'ai une autre condition qui elle me pose soucis. La durée ne doit pas etre plus longue qu'une certaine valeur (toujours a définir, admettons pour l'exemple 00:30:00).
    Malheureusement un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM `matable` WHERE (DATE(begin) BETWEEN :date1 ANS :date2) AND (`PI_begin` == NULL OR `PI_end` == NULL) AND `duration` > '00:30:00'
    ne suffit pas, puisque la durée n'est pas celle de la ligne seule.
    C'est les durées des lignes 4 + 5 + 6 et celle de 8 + 9.

    Et je dois dire que la je sèche un peu.

    J’étais partie sur des requêtes imbriquées mais ne suis pas réellement sûr d'être sur la bonne voie, je dois avouer que je n'ai pas pratiquer de SQL depuis quelques temps .
    J'ai toujours la possibilité de faire ce traitement en php, mais il est je pense préférable de le faire en MySQL puisque la réponse sera plus performante (De plus, c'est frustrant quand on arrive pas a faire la requête souhaitais)

    Je me permet donc de solliciter votre aide, en espérant avoir été relativement clair.

    PS: Encore désolé de la mise en forme un peu 'hardcore' et des fautes par dizaines que j'ai surement encore laissé passer...

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 014
    Points : 23 702
    Points
    23 702
    Par défaut
    Bonjour,

    Peut-on connaître le type de chacun de ces champs ?
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Ozvald Voir le message
    Bonjour,
    begin (datetime), end(datetime), PI_begin (varchar), PI_end (varchar), duration (time)
    Je les avaient indiqué entre les parenthèses .

    Pour rappel, seul les deux var_char peuvent valoir NULL, et donc ne pas avoir de valeur.
    De même les valeurs des var_char sont purement des exemples, j'aurais pu mettre 'toto', 'tata', 'titi', 'tutu',... mais ce serait bien moins explicatif à mon sens.

  4. #4
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    Salut,

    déjà je te conseil une parenthèse autour de ta dernière condition.

    si ta colonne est de type char(8), varchar(8), datetime ou time ça devrait marcher normalement, vu que l'opérateur regarde la date comme une chaine de caractère en fait...

    C'est normal que les durées correspondent au début et à la fin de chaque événement?

    Sinon autan calculer duration à la volée avec timediff et virer cette colonne
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Oui la correspondance est normal,
    et l'intérêt de la supprimer n'est pas flagrante (je pense) puisque ce sont des données qui sont récupéré d'un fichier csv (donc un simple import).

    Au niveau de la parenthèse je ne suis pas sur de bien comprendre.
    La requêtes exécuté fonctionne, mais ne fais pas la totalité de ce que je voudrais.

    Actuellement je récupère quelque chose comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      begin              | end                 | PI_begin | PI_end   | duration
     2010-10-21 10:00:00 | 2010-10-21 10:10:00 | PI_01    |          | 00:30:00
     2010-10-21 11:05:00 | 2010-10-21 11:30:00 |          | PI_02    | 00:45:00
     2010-10-21 13:30:00 | 2010-10-21 14:00:00 | PI_03    |          | 01:00:00
     2010-10-21 15:00:00 | 2010-10-21 15:10:00 |          | PI_04    | 00:30:00
    Hors il me faudrait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      begin              | end                 | PI_begin | PI_end   | duration
     2010-10-21 10:00:00 | 2010-10-21 10:10:00 | PI_01    |          | 00:30:00
     2010-10-21 10:40:00 | 2010-10-21 10:50:00 |          |          | 00:15:00
     2010-10-21 11:05:00 | 2010-10-21 11:30:00 |          | PI_02    | 00:45:00
     2010-10-21 13:30:00 | 2010-10-21 14:00:00 | PI_03    |          | 01:00:00
     2010-10-21 15:00:00 | 2010-10-21 15:10:00 |          | PI_04    | 00:30:00
    La différence est que je ne cherche pas à savoir si duration > '00:30:00' mais si les durées additionnés entre les PI le sont.

    Pour essayer d'être un peu plus clair.
    Si j'ai un PI_begin et que je n'ai pas de PI_end,
    que sur la ligne d'aprés je n'ai donc pas de PI_begin (logique de la bdd) mais que j'ai un PI_end,
    alors j'additionne les deux duration pour savoir si elles sont > '00:30:00'.

    Evidemment cela peux se faire n fois, tant que je n'ai pas de PI_end.

    Donc mon problème et que je ne sais pas s'il est possible d'avoir une condition qui dépendent d'autre lignes.

    Merci tout de même pour votre aide.
    Et n'hésite pas à me faire remarquer si je n'ai pas compris ta réponse, ou si la mienne n'est pas suffisament explicite.

    PS: Bon définitivement, je me fourvoie dans les requêtes imbriqués ...
    Si quelqu'un a une piste je suis preneur

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/05/2006, 09h53
  2. Select ... Where.. NOT IN
    Par backus dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/11/2005, 19h11
  3. SELECT ... WHERE != ???
    Par Terminator dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/05/2005, 21h22
  4. question sur SELECT ...WHERE...IN
    Par danseur dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/01/2004, 15h23
  5. Select * Where {}
    Par Thomad dans le forum Langage SQL
    Réponses: 14
    Dernier message: 16/10/2003, 21h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo