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 29/06/2011, 17h28   #1
Rédacteur
 
Avatar de DarkVader
 
Homme
Développeur informatique
Inscription : mai 2002
Messages : 1 817
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mai 2002
Messages : 1 817
Points : 2 394
Points : 2 394
Par défaut Différence de 2 requêtes

Bonjour,
Je ne vois pas comment m'y prendre pour récupérer la différence de 2 requêtes et effectuer le tri en fonction de ce résultat :
Soit une table dont l'un des champs comptabilise un résultat à un instant t.
Je cherche à effectuer une requête qui affiche les champs triés en fonction de la plus forte progression entre 2 dates.

Quelqu'un a-t-il une idée ?
__________________
« Heureux soient les fêlés, car ils laisseront passer la lumière. »

Pensez aux liens
Rechercher - Google - Google Labs - AllApi
et avant de poster : « A lire » , « Tutoriel sur le déboguage »
DarkVader est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 18h22   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Citation:
Envoyé par DarkVader Voir le message
Je cherche à effectuer une requête qui affiche les champs triés en fonction de la plus forte progression entre 2 dates.
Saluton,
Entre deux dates consécutives ?
__________________
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 18h27   #3
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 853
Points : 1 332
Points : 1 332
salut,

si tu veux l'intersection entre 2 requêtes, tu peux soit utiliser des jointures soit une sous requête.
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 19h06   #4
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Je vais donc supposer que par entre 2 dates, tu veux dire 2 dates consécutives, c'est à dire qu'il n'y a pas de date intermédiaire.
Voilà ce que j'ai fait:
Citation:
CREATE TABLE IF NOT EXISTS `historique` (
`id` int(2) NOT NULL,
`jour` date NOT NULL,
`score` int(5) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `historique`
--

INSERT INTO `historique` (`id`, `jour`, `score`) VALUES
(1, '2011-06-06', 12),
(2, '2011-06-14', 14),
(3, '2011-06-21', 19),
(4, '2011-06-28', 27);
A quoi j'applique cette requête
Code sql :
1
2
3
4
5
SELECT h1.jour, h1.score, h2.jour,h2.score, h2.score-h1.score AS ecart
FROM historique h1
INNER JOIN historique h2 ON h2.jour=(SELECT MIN(jour) FROM historique WHERE jour > h1.jour)
ORDER BY ecart DESC
LIMIT 1
qui retourne bien
Citation:
jour score jour score ecart
2011-06-21 19 2011-06-28 27 8
L'astuce est de corréler la sous-requête de la clause de jointure avec la table initiale.
Il demeure un problème, le LIMIT 1 supprime les éventuelles ex-aequos.
__________________
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 19h23   #5
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 853
Points : 1 332
Points : 1 332
pour faire simple l'intersection c'est juste un inner join où la condition de jointure correspond à l'égalité de toutes les colonnes de la table gauche et droite

si tes dates ne sont pas consécutives (cas général tu utilise un between dans chaque requêtes)...

je suppose 2 tables t1(id,a,b,datet) et t2(id,a,b,datet)

pour faire l'intersection entre t1 et t2 pour datet entre date1 et date2 avec date1<date2:
Code sql :
1
2
3
4
SELECT t1.a,t1.b FROM t1
INNER JOIN (SELECT t2.a AS a,t2.b AS b FROM t2 WHERE t2.datet BETWEEN date1 et date2) temp
ON t1.a=temp.a AND t1.b=temp.b
WHERE t1.datet BETWEEN date1 et date2

voilà l'idée générale
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 19h35   #6
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Citation:
Envoyé par DarkVader Voir le message
Je cherche à effectuer une requête qui affiche les champs triés en fonction de la plus forte progression entre 2 dates.
Suis-je bête, tu peux supprimer le LIMIT 1 de ma requête et le tour est joué.
Quant à la proposition d'ericd69, je ne vois pas à quoi correspondent les colonnes a et b.
__________________
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 19h42   #7
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 853
Points : 1 332
Points : 1 332
Citation:
Envoyé par Maljuna Kris Voir le message
Suis-je bête, tu peux supprimer le LIMIT 1 de ma requête et le tour est joué.
Quant à la proposition d'ericd69, je ne vois pas à quoi correspondent les colonnes a et b.
comme il nous donne pas de structure ce sont des colonnes génériques...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 20h07   #8
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Il nous dit qu'il cherche à comparer l'écart d'une colonne résultat entre les lignes d'une table pour deux valeurs d'une autre colonne de type date, valeur que j'ai supposées consécutives.
La requête ne semble donc concerner que deux colonnes de la table la colonne contenant le résultat et la colonne contenant la date.
Enfin, c'est ce que j'ai compris du message initial certes plutôt abscons.
__________________
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 20h35   #9
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 853
Points : 1 332
Points : 1 332
il a différents exemples de syntaxes pour faire la même chose dans différents cas de figure et donc à lui de voir. Maintenant, vu le peu d'infos données
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 21h18   #10
Rédacteur
 
Avatar de DarkVader
 
Homme
Développeur informatique
Inscription : mai 2002
Messages : 1 817
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mai 2002
Messages : 1 817
Points : 2 394
Points : 2 394
Désolé,
c'était effectivement très light mais je devais m'absenter et ne pensais pas que vous seriez aussi prolixe sur le sujet.
Je jetterais un œil plus attentif à vos propositions dès demain matin et vous remercie déjà de vos contributions.

En attendant, pour plus de précision :
la table Stat
les champs : `DATE``idRes``stat1`
le remplissage de la table s'effectue via un script exécuté par le planificateur de tâches de mon hébergeur à fréquence régulière -
il consiste à sauvegarder un instantané de certaines données.

La requête recherchée doit permettre de lister pour chaque date (abscisse) et pour chaque idRes(ordonnée)
la variation (différence) de stat1 entre chaque date afin de permettre un affichage tableau des données puis sous forme d'un chart.

Cette fois-ci, j'espère avoir été moins ... court.
__________________
« Heureux soient les fêlés, car ils laisseront passer la lumière. »

Pensez aux liens
Rechercher - Google - Google Labs - AllApi
et avant de poster : « A lire » , « Tutoriel sur le déboguage »
DarkVader est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 22h00   #11
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 853
Points : 1 332
Points : 1 332
sacré toi

en effet ça change la donne... aucun de nous a bon lol

parce qu'en fait, tu fais un graph 3d et non 2d vu que tu traces `DATE`,`idRes`, ecart

le problème qui se pose tient du group by plutôt donc et d'une fonction ensembliste dépendant de ce que tu veux obtenir comme écart (minimum, moyen, maximum)

car tu peux donc avoir plusieurs `DATE` pour un même `idRes` ou inversement non?
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 22h40   #12
Rédacteur
 
Avatar de DarkVader
 
Homme
Développeur informatique
Inscription : mai 2002
Messages : 1 817
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mai 2002
Messages : 1 817
Points : 2 394
Points : 2 394
Désolé, à faire vite, on dit des âneries.

En ordonnée, c'est la valeur de stat1 et chaque courbe représentera un idRes.
Au final, je vais faire un limit n afin de ne conserver que les n meilleures progressions et établir un graphe de courbes pour chaque idRes
soit un graphe du style

Date restera en abscisse.
__________________
« Heureux soient les fêlés, car ils laisseront passer la lumière. »

Pensez aux liens
Rechercher - Google - Google Labs - AllApi
et avant de poster : « A lire » , « Tutoriel sur le déboguage »
DarkVader est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 22h54   #13
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 853
Points : 1 332
Points : 1 332
donc faut découper le pb en 2:
la liste des `idRes` et pour chacun la simple sélection de stat1 par date
en gros simplement une procédure stockée avec un curseur qui balaye les `idRes`et génère un jeu de résultat pour chacun d'eux représentant les couples (`idRes`,`stat1`) sans autre forme de calcul (pas de moyenne ou autre truc du genre)... HEIN?

ça correspond bien cette fois?
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 23h17   #14
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
@ericd69 > tu oublies
Citation:
ne conserver que les n meilleures progressions
Donc les idRes pour lesquels l'écart entre les valeurs de stat1 à la date de début de la période et la date de fin de période est le plus élevé.
__________________
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 23h21   #15
Rédacteur
 
Avatar de DarkVader
 
Homme
Développeur informatique
Inscription : mai 2002
Messages : 1 817
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mai 2002
Messages : 1 817
Points : 2 394
Points : 2 394
Ben j'avais pas mieux sous la main comme graphe
mais le principe de départ était la variation d'une date à l'autre
plutôt que la valeur cumulée de stat1 d'où l'opération ecart de date à date.

Ceci dit, j'étais parti pour pratiquer ainsi :
- liste des n dernières dates
- pour les 2 dernières dates, identification des p idRes ayant subies les plus fortes variations de stat1
- puis ensuite pour chaque date de n dates correspondant à la liste précédemment identifiée, compléter le tableau.
__________________
« Heureux soient les fêlés, car ils laisseront passer la lumière. »

Pensez aux liens
Rechercher - Google - Google Labs - AllApi
et avant de poster : « A lire » , « Tutoriel sur le déboguage »
DarkVader est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 23h35   #16
Rédacteur
 
Avatar de DarkVader
 
Homme
Développeur informatique
Inscription : mai 2002
Messages : 1 817
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mai 2002
Messages : 1 817
Points : 2 394
Points : 2 394
Citation:
Envoyé par Maljuna Kris Voir le message
@ericd69 > tu oubliesDonc les idRes pour lesquels l'écart entre les valeurs de stat1 à la date de début de la période et la date de fin de période est le plus élevé.
Au temps pour moi, j'aurais du préciser (c'est comme dit au post précédent), que mon choix portait plutôt sur les variations entre les 2 dernières dates pour fixer la liste à suivre
car des idRes peuvent disparaitre sur la période tout comme d'autres peuvent être ajoutées.
Le fait de préférer la période de référence la plus récente permet de mieux coller à l'actualité.
__________________
« Heureux soient les fêlés, car ils laisseront passer la lumière. »

Pensez aux liens
Rechercher - Google - Google Labs - AllApi
et avant de poster : « A lire » , « Tutoriel sur le déboguage »
DarkVader est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 23h42   #17
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Evite les mots réservés SQL pour les noms de colonnes (DATE).
Je te propose de travailler à partir de cette requête
Code sql :
1
2
3
4
5
6
7
8
SELECT r.jour,r.idRes,r.stat1,
        (SELECT MAX(r2.stat1) FROM resultat r2 WHERE r2.idRes=r.idRes AND r2.jour=fin)-
        (SELECT MIN(r3.stat1) FROM resultat r3 WHERE r3.idRes=r.idRes AND r3.jour=debut)
        AS ecart
FROM resultat r
WHERE r.jour BETWEEN debut AND fin
ORDER BY ecart DESC, r.idRes, r.jour
LIMIT n
ou debut et fin sont les dates de la période et n le nombre de lignes que tu veux conserver.
Je n'ai pas testé la requête.
__________________
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 23h45   #18
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 853
Points : 1 332
Points : 1 332
y a que toi qui peu dire l'unicité des couples (`idRes`,`DATE`)
et donc le type de traitement en dépendra...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 23h58   #19
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 853
Points : 1 332
Points : 1 332
nos interventions arrivent pas dans l'ordre lol... pas grave

pourquoi limites tu le max au dernier jour et le min sur le premier? rien ne te garantit qu'ils n'apparaissent pas ailleurs dans l'intervalle de date ?

mais sinon ça donnera bien le résultat voulu
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 00h01   #20
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Il veut la progression de l'idRes sur la période.
__________________
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)
Maljuna Kris 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 02h43.


 
 
 
 
Partenaires

Hébergement Web