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 :

Requête un peu compliquée


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Requête un peu compliquée
    Bonjour à tous, voici un exemple de table et de ce qu'il faut en sortir :
    +----------------+
    | Heure | Variable |
    -----------------+
    | 00:00 | 0 |
    | 01:05 | 1 |
    | 01:09 | 1 |
    | 01:45 | 1 |
    | 02:24 | 0 |
    | 12:20 | 1 |
    | 12:40 | 0 |
    | 14:32 | 0 |
    | 18:20 | 1 |
    | 18:21 | 1 |
    | 20:40 | 0 |

    J'ai besoin d'obtenir les heurs où il y a eu un changement de la valeur de "variable".
    Après la (ou les) requete(s) je dois donc obtenir:
    00:00
    01:05
    02:24
    12:20
    12:40
    18:20
    20:40
    Je ne vois pas comment faire en très peu de requete. Une idée ?

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Que penses-tu de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT SUBSTRING(heure,1,2) AS Plage_Horaire,
    GROUP_CONCAT(heure) as heures, 
    COUNT(DISTINCT variable) as chgts
    FROM latable
    GROUP BY Plage_Horaire
    HAVING chgts > 1
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Je tenterais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SET @R = -1; 
    SET @V = 0;
    SELECT HEURE, VARIABLE FROM (
    SELECT @R AS R1, @V := @R, @R := VARIABLE AS R2, HEURE, VARIABLE FROM MYTABLE  
    ORDER BY HEURE)T
    WHERE T.R1 <> T.R2;

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Aucune des 2 methode ne donne de résultat

  5. #5
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    On peut voir un SHOW CREATE TABLE de la table ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Maljuna, ta methode ne marche que si le changement de "variable" se fait exactement a la meme heure, tu voit comment résoudre ca ?

    PS : j'ai ismplifié l'exemple comparé à ma table

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    La requete que j'ai déposé donne :

    00:00:00;0
    01:05:00;1
    02:24:00;0
    12:20:00;1
    12:40:00;0
    18:20:00;1
    20:40:00;0

    Ce qui me semble être le résultat demandé.

  8. #8
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par tchem Voir le message
    Maljuna, ta methode ne marche que si le changement de "variable" se fait exactement a la meme heure, tu voit comment résoudre ca ?

    PS : j'ai simplifié l'exemple comparé à ma table
    Normalement ça compte les changements de variable au cours de la même heure, heure prise au sens n° de l'heure pas au cours des 60 dernières minutes.
    C'est plutôt cela que tu voulais ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    Pour ma part, c'est résolu.

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Non je ne voulais pas au cours de la meme heure mais en général, le résultats de fabrice est exactement correcte, mais en exécutant sa requête j'ai aucun résultat

    Fabrice es tu sûr qu'il y a aucune erreur de syntaxe dans écrivant ta solution ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    Bonsoir,

    J'ai créé un table ESSAI avec
    Heure Time
    Variable int

    J'ai inseré le jeu d'essai posé.

    00:00:00 0
    01:05:00 1
    01:09:00 1
    01:45:00 1
    02:24:00 0
    12:20:00 1
    12:40:00 0
    14:32:00 0
    18:20:00 1
    18:21:00 1
    20:40:00 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SET @R = -1; 
    SET @V = 0;
    SELECT HEURE, VARIABLE FROM (
    SELECT @R AS R1, @V := @R, @R := VARIABLE AS R2, HEURE, VARIABLE FROM ESSAI E 
    ORDER BY HEURE)T
    WHERE T.R1 <> T.R2
    ;
    me donne le bon résultat.

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    si les 0 et 1 de "variabl"e ne sont pas numérique mais des strings
    genre 0 devient "00-00" et 1 devient "20-00" ca doit fonctionnait sans modificaton ?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    Pour moi, la requete doit fonctionner quelque soit le type de variable.

  14. #14
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Voici ma requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SET @R = -1;
    SET @V = 0;
    SELECT time_sys, Param FROM (
    SELECT @R AS R1, @V := @R, @R := Param AS R2, time_sys, Param FROM f2e
    ORDER BY time_sys)T
    where (time_sys>'2009-3-4 00:00:00') And (time_sys<'2009-3-4 23:59:59') and T.R1 <> T.R2;
    Avec time_sys la date/heure, et Param une string.
    La requete dans 0 row, une idée ?

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    Comme Param est une string

    Change
    par

  16. #16
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Malheuresement ca ne donne toujours rien meme avec ' ' au lieu de 1

  17. #17
    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 018
    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 018
    Points : 23 710
    Points
    23 710
    Par défaut
    Citation Envoyé par tchem Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where (time_sys>'2009-3-4 00:00:00') And (time_sys<'2009-3-4 23:59:59')
    La comparaison des dates nécessite des 0 devant le mois et le jour. Et tant qu'on y est, c'est mieux d'utiliser BETWEEN que 2 comparaisons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...where time_sys BETWEEN '2009-03-04 00:00:00' AND '2009-03-04 23:59:59'
    ced
    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

  18. #18
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    J'ai supprimé mon précédent message car j'ai enfin compris ce que tu voulais obtenir, et je crois que cette nouvelle requête y parvient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT hv.`heure`, hv.`variable` ,
    (SELECT hv2.`heure`
    FROM `heures_variable` hv2
    WHERE hv2.heure > hv.heure
    ORDER BY hv2.heure
    LIMIT 1)hora,
    (SELECT hv3.`variable`
    FROM `heures_variable` hv3
    WHERE hv3.heure > hv.heure
    ORDER BY hv3.heure
    LIMIT 1)valor
    FROM `heures_variable` hv
    HAVING (hv.`variable` <> valor)
    OR valor IS NULL
    J'ignore comment MySQL apprécie les sous-requêtes dans la clause de projection et je sais que cet emploi de HAVING sans clause GROUP BY est plutôt exotique mais, voilà ce que j'obtiens
    heure variable hora valor
    00:00:00 0 01:05:00 1
    01:45:00 1 02:24:00 0
    02:24:00 0 12:20:00 1
    12:20:00 1 12:40:00 0
    14:32:00 0 18:20:00 1
    18:20:00 1 20:40:00 0
    20:40:00 0 NULL NULL
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

Discussions similaires

  1. Requête SQL de recherche un peu compliquée
    Par ned-flanders dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/04/2013, 14h25
  2. Requête un peu compliquée
    Par molo1987 dans le forum SQL
    Réponses: 17
    Dernier message: 06/01/2013, 09h33
  3. [PHP 5.2] Résultat d'une requête dans un tableau un peu compliqué
    Par renaud26 dans le forum Langage
    Réponses: 7
    Dernier message: 31/03/2011, 06h28
  4. [SQL - ORACLE] Requete un peu compliquée (pour moi)
    Par Worldofdada dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/11/2005, 08h25
  5. Requête un peu trop compliqué pour moi
    Par Kokito dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2005, 15h17

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