Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/09/2011, 18h12   #1
Modérateur
 
Avatar de Golgotha
 
Homme cédric
Développeur informatique
Inscription : août 2007
Messages : 732
Détails du profil
Informations personnelles :
Nom : Homme cédric
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2007
Messages : 732
Points : 1 562
Points : 1 562
Envoyer un message via Skype™ à Golgotha
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 :
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
__________________
modérateur webmasters - développements web & php
faq jQuery - règles du forum - faqs web
mon espace perso
Venez participez au deuxième defi Web !
Golgotha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 08h56   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
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 ?

Citation:
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 14h44   #3
Modérateur
 
Avatar de Golgotha
 
Homme cédric
Développeur informatique
Inscription : août 2007
Messages : 732
Détails du profil
Informations personnelles :
Nom : Homme cédric
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2007
Messages : 732
Points : 1 562
Points : 1 562
Envoyer un message via Skype™ à Golgotha
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.
__________________
modérateur webmasters - développements web & php
faq jQuery - règles du forum - faqs web
mon espace perso
Venez participez au deuxième defi Web !
Golgotha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 16h13   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 22h18   #5
Modérateur
 
Avatar de Golgotha
 
Homme cédric
Développeur informatique
Inscription : août 2007
Messages : 732
Détails du profil
Informations personnelles :
Nom : Homme cédric
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2007
Messages : 732
Points : 1 562
Points : 1 562
Envoyer un message via Skype™ à Golgotha
Avec la colonne player indexé j'ai un gain de 80% de temps,

donc c'est parfait :cool:

__________________
modérateur webmasters - développements web & php
faq jQuery - règles du forum - faqs web
mon espace perso
Venez participez au deuxième defi Web !
Golgotha est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h15.


 
 
 
 
Partenaires

Hébergement Web