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 :

sub-query, join ou autre.


Sujet :

Requêtes MySQL

  1. #1
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 386
    Points : 3 531
    Points
    3 531
    Billets dans le blog
    1
    Par défaut sub-query, join ou autre.
    Bonjour,

    j'ai une table avec des données qui sont inséré tout les jours, avec la date du jour dans "created", chaque jour il y à la "population" qui change dans la table pour chaque village, et il me faut dans la requête, le delta du j et j-1 de la population, j'ai fait deux sous-requête pour ça : une requête qui ramène la population du jour j, une autre qui ramène la population du jour j-1, et je fait le delta, est ce que ça serait mieux de faire ça avec des "join" ou les sous requête sont viable ou si vous avez un moyen plus optimisé je suis preneur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    SELECT x.aid, x.vid, x.village, x.population, d.delta 
    FROM 
    (
        SELECT TO_DAYS(MAX(created)) AS mx 
        FROM x_world
    ) s, 
    (
        SELECT min.vid, min.village, (max.population - min.population) delta 
        FROM 
        (
            SELECT vid, village, population 
            FROM 
            (
                SELECT TO_DAYS(MAX(created))-1 AS mx 
                FROM x_world
            ) s, x_world x 
            WHERE player = %s 
                AND TO_DAYS(x.created) = s.mx
        ) min, 
        (
            SELECT vid, village, population 
            FROM 
            (
                SELECT TO_DAYS(MAX(created)) AS mx 
                FROM x_world
            ) s, x_world x 
            WHERE player = %s 
                AND TO_DAYS(x.created) = s.mx
        ) max 
        WHERE min.vid = max.vid
    ) d, x_world x 
    WHERE player = %s 
        AND TO_DAYS(x.created) = s.mx 
        AND x.vid = d.vid
    Merci d'avance
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Quelle horreur cette requête ! J'ai mis 5 minutes à la remettre en forme !

    Tu as grand besoin d'apprendre les jointures !

    Je déduis de ta requête la structure (peut-être partielle) suivante de ta table :
    x_world (vid, village, population, created, player)

    Pourquoi avoir appelé la table x_world (monde) alors qu'elle contient des infos sur la population de villages ?

    Peut-être as-tu besoin aussi d'apprendre à modéliser les données ?

    j'ai une table avec des données qui sont insérées tous les jours, avec la date du jour dans "created", chaque jour il y a la "population" qui change dans la table pour chaque village, et il me faut dans la requête, le delta du j et j-1 de la population
    Si vraiment les données sont insérées tous les jours calendaires, on va se baser sur le fait que la veille d'une date D est D - 1 jour et ne pas rechercher la date précédent D dans la table comme on devrait le faire s'il y a des trous dans le calendrier.

    Si ces suppositions sont justes, je pense que cette requête devrait répondre à ton besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT w1.vid, w1.village, w1.population, w1.created AS jour
        (w1.population - w2.population) AS delta
    FROM x_world w1
    INNER JOIN x_world w2 
        ON w2.vid = w1.vid
        AND w2.created = DATE_SUB(w1.created, INTERVAL 1 DAY)
        AND w2.player = w1.player
    WHERE w1.player = %s
    Beaucoup plus simple non ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 386
    Points : 3 531
    Points
    3 531
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Merci beaucoup.

    Pour la modélisation, je n'y suis pour rien, j'utilise ce qu'on me donne...

    Il manque juste la date max de la table que j'ai ajouté est ça me donne le même résultat, c'est sûr que c'est plus jolie

    Malheureusement, et c'est ce que je pensait, ça ne sert à rien, les temps sont identique à ma requête "toute moche"

    Merci quand même.
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    La colonne player est-elle indexée ?

    Quel est le temps de réponse de la requête directement soumise au serveur et pour quel volume de données ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 386
    Points : 3 531
    Points
    3 531
    Billets dans le blog
    1
    Par défaut
    Avec la colonne player indexé j'ai un gain de 80% de temps,

    donc c'est parfait :cool:

    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

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

Discussions similaires

  1. Update avec sub query
    Par FelixGe dans le forum Langage SQL
    Réponses: 7
    Dernier message: 11/06/2012, 14h56
  2. extraire un sub set d'un autre type
    Par typedef dans le forum SL & STL
    Réponses: 4
    Dernier message: 14/12/2010, 17h34
  3. Enregistrer les données d'une requête SQL Query sur une autre table
    Par LE MAHJONG dans le forum Bases de données
    Réponses: 4
    Dernier message: 23/09/2008, 20h02
  4. Enregistrer le résultat d'un Query dans un autre Tableau
    Par aliwassem dans le forum Bases de données
    Réponses: 4
    Dernier message: 14/02/2007, 14h22
  5. Réponses: 4
    Dernier message: 28/08/2006, 13h04

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