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 :

UPDATE insoluble sur requete croisee


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut UPDATE insoluble sur requete croisee
    Bonjour a tous,
    Voila un probleme hardu que je n'arrive pas a resoudre.

    J'ai une table contenant des logs (issus d'un fichier mis a jour toutes les 5 minutes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mysql> SELECT * FROM logs WHERE alert_type > 0;
    +--------+---------------------+-------------+------------+------+
    | id     | date                | id_terminal | alert_type | info |
    +--------+---------------------+-------------+------------+------+
    | 738135 | 2009-03-30 17:16:34 |          14 |         10 | 56   |
    | 738137 | 2009-03-30 17:16:38 |          14 |         13 | 567  |
    | 738138 | 2009-03-30 17:16:40 |          25 |         13 | 456  |
    | 738194 | 2009-03-30 17:21:38 |          25 |         13 | 361  |
    +--------+---------------------+-------------+------------+------+
    Ces alertes sont regulierement ajoutees a une autre table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    mysql> SELECT * FROM alerts;
    +--------+---------------------+-------------+------------+------+----------+
    | id     | date_begin          | id_terminal | alert_type | info | date_end |
    +--------+---------------------+-------------+------------+------+----------+
    | 737136 | 2009-03-30 17:06:11 |          14 |         13 |  53  | NULL     |
    | 738090 | 2009-03-30 17:11:38 |          25 |         10 | 273  | NULL     |
    +--------+---------------------+-------------+------------+------+----------+
    Je cherche a executer une requete qui va definir date_end a NOW() a condition que l'alerte ne soit plus dans les logs (meme id_terminal, meme alert_type, l'info n'a pas d'importance). Ici par exemple, on voit que l'alerte 13 sur le terminal 14 est toujours active (2e ligne des logs) alors que l'alerte 10 sur le terminal 25 a disparu.

    Seulement, voila... Je ne vois pas du tout comment tourner ma requete pour y arriver. Quelqu'un pourrait il m'aider ?

    Merci d'avance
    Santiago

  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 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

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

    Citation Envoyé par chebarbudo Voir le message
    Ici par exemple, on voit que l'alerte 13 sur le terminal 14 est toujours active (3e ligne des logs) alors que l'alerte 10 sur le terminal 25 a disparu.
    Tu es sûr de çà ? Parce que la deuxième ligne de ta première requête correspond bien à une alerte 10 sur le terminal 25 .

    Tu peux préciser ce qui définit, dans la table des logs, l'activité d'une alerte ?

    ced

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour Ced et merci de ton aide,
    Citation Envoyé par ced Voir le message
    Tu es sûr de çà ? Parce que la deuxième ligne de ta première requête correspond bien à une alerte 10 sur le terminal 25 .
    Effectivement, mon exemple etait mauvais. Ca y est j'ai mis a jour mon post.
    Citation Envoyé par ced Voir le message
    Tu peux préciser ce qui définit, dans la table des logs, l'activité d'une alerte ?
    La simple presence de l'alerte dans la table des logs (meme id_terminal, meme alert_type) quelle que soit l'heure et l'info signifie qu'elle est active. C'est en realite une autre requete qui sous certaines conditions desactive les alertes en mettant alert_type = 0. D'ou mon exemple (faux avant la mise a jour) :
    L'alerte 13 sur 14 est toujours active
    L'alerte 10 sur 25 a disparu

    Santiago

  4. #4
    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 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 040
    Points : 23 795
    Points
    23 795
    Par défaut
    OK, c'est plus clair à présent .
    Alors, il va falloir faire un update avec une jointure à gauche.
    Ca doit donner quelque chose un peu comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE alerts
    LEFT JOIN logs ON alerts.id_terminal = logs.id_terminal 
        AND alerts.alert_type = logs.alert_type
    SET alerts.date_end = NOW()
    WHERE alerts.date_end IS NULL
    AND logs.id IS NULL
    Attention, j'ai écrit cette mise à jour de tête et je ne l'ai absolument pas testée. Donc, il faut que tu testes (et éventuellement corrige si j'ai fait une erreur) sur un environnement de test, ou dans une transaction (si tu es en moteur InnoDB), pour éventuellement faire un ROLLBACK si le résultat n'est pas correct.

    ced

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci Ced,

    Ta requete marche parfaitement, bravo !

    Petite question subsidiaire. Il m'arrive parfois de faire des essai dans des environement de test mais c'est lourd : creer une base, dupliquer une ou plusieurs tables, etc...
    Pourrait tu en deux mots me parler des transactions (syntaxe, fonctionnement) ou me dire ou trouver un tuto ?

    Merci encore
    Santiago

  6. #6
    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 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 040
    Points : 23 795
    Points
    23 795
    Par défaut
    Sous MySQL, pour pouvoir profiter des transactions, il faut que le moteur de la table soit InnoDB (le moteur MyIsam ne supporte pas les transactions).
    Tu trouveras des informations complémentaires dans la documentation MySQL
    On démarre une transaction avec l'instruction START TRANSACTION ou BEGIN.
    Si on a un problème, on fait ROLLBACK et ça annule toutes les modifications faites dans la transaction.
    Si tout est bon (tout ce qui est après le BEGIN), on fait COMMIT...

    ced

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    OK merci Ced, c'est tres clair.
    Je nai plus qu'a me pencher sur le tuto pour approfondir.

    Merci encore
    Santiago

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Etat sur Requete Croisee
    Par chris45 dans le forum IHM
    Réponses: 1
    Dernier message: 22/03/2012, 13h25
  2. Aide sur requetes analyse croisee - Peut on la rendre dynamique?
    Par CPSMC dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/02/2010, 17h11
  3. probleme update avec where sur requete imbriqué
    Par JulienCEA dans le forum Requêtes
    Réponses: 11
    Dernier message: 04/06/2008, 11h44
  4. [HQL] probleme sur requete Update
    Par __Ez__ dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/04/2008, 11h12
  5. Exception sur requete UPDATE
    Par crocodile dans le forum Langage
    Réponses: 3
    Dernier message: 05/07/2006, 17h12

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