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 :

Probleme sur une Jointure complexe


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 101
    Par défaut Probleme sur une Jointure complexe
    Bonjour,

    Etant novice dans l'utilisation de sql j'ai besoin de votre aide sur une jointure. J'ai lu pas mal de docs mais je suis un peu dépassé par la complexité de la requête, et je sais pas si c'est faisable en une seule.
    J'ai deux tables :
    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
    CREATE TABLE `stations` (
    		  `id` int(11) NOT NULL,
    		  `nom` varchar(50) NOT NULL,
    		  `commune` varchar(50) NOT NULL,
    		  `adresse` varchar(100) NOT NULL,
    		  `lat` float default NULL,
    		  `lon` float default NULL,
    		  UNIQUE KEY `id` (`id`)
    		) ENGINE=MyISAM DEFAULT CHARSET=latin1_general_ci COMMENT='Stations services'
     
    CREATE TABLE `prix` (
    		  `id` int(11) NOT NULL,
    		  `type` ENUM('diesel','sp95','gpl'),
    		  `prix` float default NULL,
    		  `maj` date default NULL,
    		  KEY `id` (`id`)
    		) ENGINE=MyISAM DEFAULT CHARSET=latin1_general_ci COMMENT='Prix du carburant'
    Je veux sélectionner toutes les stations dont il existe un prix dans la table prix pour le type gpl par exemple.
    J'y arrive par le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * FROM `stations` WHERE 
    `lat` IS NOT NULL AND 
    `lon` IS NOT NULL AND 
    (SELECT COUNT(*) FROM `prix` WHERE `type` = 'gpl' AND prix.id=stations.id)>0 
    ORDER BY POW(`lat`-42,2)+POW(`lon`-2,2) ASC 
    LIMIT 0,10
    Par contre j'aimerais aussi sélectionner le dernier prix enregistre pour chacune de ces stations. La table prix peut contenir plusieurs enregistrement pour la même id avec des date de maj différentes. Peut on joindre le dernier prix en une seule requête ou il faut faire plusieurs requêtes ?
    J'ai l'impression que c'est possible mais ça me dépasse un peu. Quelqu'un pourrait m'aider sur ce coup la ?
    Merci

  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 : 73
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    A priori c'est faisable par une sous-requête corrélée et qui aura une clause ORDER BY sur le prix DESC et LIMIT 1.
    Je n'ai pas le temps tout de suite, mais si tu n'y arrives pas tout seul, je repasserai après déjeuner.
    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 confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 101
    Par défaut
    C'est un peu ce que j'imagine mais je n'arrive pas à l'écrire. C'est peut être pas très complexe mais là ça sort pas.
    Merci de votre aide.

  4. #4
    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 : 73
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Je pensais à quelque chose de cet ordre là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT * , COALESCE((SELECT p.prix 
                FROM prix 
                WHERE p.`type` = 'gpl' 
                    AND p.id=stations.id 
                 ORDER BY p.maj DESC 
                 LIMIT 1),0) AS precio
    FROM `stations` WHERE 
    `lat` IS NOT NULL AND 
    `lon` IS NOT NULL AND 
    (SELECT COUNT(*) FROM `prix` WHERE `type` = 'gpl' AND prix.id=stations.id)>0 
    ORDER BY POW(`lat`-42,2)+POW(`lon`-2,2) ASC 
    LIMIT 0,10
    que je n'ai évidemment pas testé.
    Le problème avec ce genre de requête, c'est que c'est très gourmand en ressources.
    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)

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 101
    Par défaut
    Merci de votre réponse, ça fonctionne.
    Par contre si je veux aussi garder le champ maj de la table prix je dois faire comme ca :
    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
    SELECT * , COALESCE((SELECT prix 
                FROM prix 
                WHERE `type` = 'gpl' 
                    AND prix.id=stations.id 
                 ORDER BY maj DESC 
                 LIMIT 1),0) AS precio, 
    COALESCE((SELECT maj 
                FROM prix 
                WHERE `type` = 'gpl' 
                    AND prix.id=stations.id 
                 ORDER BY maj DESC 
                 LIMIT 1),0) AS maj2
    FROM `stations` WHERE 
    `lat` IS NOT NULL AND 
    `lon` IS NOT NULL AND 
    (SELECT COUNT(*) FROM `prix` WHERE `type` = 'gpl' AND prix.id=stations.id)>0 
    ORDER BY POW(`lat`-42,2)+POW(`lon`-2,2) ASC 
    LIMIT 0,10
    C'est la seule solution ?
    Sinon il y a un truc bizarre, le prix retourné qui est un float a l'origine me donne des résultats du genre 0.79000002145767 au lieu de 0.79. On dirait qu'il y a une conversion qui fait apparaitre des arrondis.
    Dernier point, est ce qu'il y a moyen de faire plus performant que cela ?
    Merci

  6. #6
    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 : 73
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Pour le problème de FLOAT, c'est peut-être réglable en transformant la colonne prix en type DOUBLE (j'ai bien écrit peut-être).
    La complexité de la requête peut être due à une modélisation maladroite.
    Mais je n'ai pas, en l'état, assez d'informations sur le schéma de la base pour me prononcer.
    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)

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

Discussions similaires

  1. [DB2] Problèmes avec une Jointure externe sur des vues
    Par treivse dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/07/2006, 11h42
  2. limitation du nombre d'enregistrement sur une jointure
    Par coredump dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/06/2005, 16h13
  3. Probleme sur une fonction vérif
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/10/2004, 13h25
  4. un count sur une jointure et ca ne fonctionne pas
    Par elbronziero dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/10/2004, 11h23
  5. Problème sur une cmd avec AWK
    Par OrangeBud dans le forum Linux
    Réponses: 3
    Dernier message: 02/06/2004, 10h51

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