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

Langage SQL Discussion :

jointure et Groupage


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 2
    Par défaut jointure et Groupage
    Bonjour,

    j'ai un petit soucis de résultat obtenu, je cherche à avoir parmis toutes les commande passé par client celles la moins onéreuse.
    J'arrive bien à recupérer le prix le plus bas mais l'identifiant de la commande c'est pas le bon

    Pour exemple j'ai créé ces 2 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    CREATE TABLE `commande` (
      `id` int(11) NOT NULL auto_increment,
      `personne` int(11) NOT NULL,
      `prix` float NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
     
    -- 
    -- Contenu de la table `commande`
    -- 
     
    INSERT INTO `commande` (`id`, `personne`, `prix`) VALUES 
    (1, 1, 18),
    (2, 1, 17),
    (3, 1, 125);
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `personne`
    -- 
     
    CREATE TABLE `personne` (
      `id` int(11) NOT NULL auto_increment,
      `nom` varchar(128) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
     
    -- 
    -- Contenu de la table `personne`
    -- 
     
    INSERT INTO `personne` (`id`, `nom`) VALUES 
    (1, 'foo'),
    (2, 'bar');
    et la requete que j'utilise est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select p.id, p.nom, c.id, min(c.prix) from personne p
    left join commande c on c.personne = p.id
    group by  c.personne
    merci pour votre aide

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Salut,

    Peut être ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT p.id, p.nom, c.id, c.prix FROM personne p
    LEFT JOIN 
    	 (select c1.personne, c1.id, c1.prix from commande c1 inner join 
    		(select personne, min(prix) as prix from commande group by personne) c2
    	  ON c1.personne = c2.personne
    	  AND c1.prix = c2.prix
     	 ) c
    ON c.personne = p.id

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Salut snipah,

    J'allais poster la même requête, je pense qu'elle ne doit pas être trop éloignée de la bonne réponse

    Sinon je pense que oupouaout utilise mysql.
    Et je suis super surpris que mysql execute ce genre de requête (l'originale ), car cette requête n'est syntaxiquement pas correcte sur oracle (par exemple).
    Sur oracle tu ne peux pas sélectionner des colonnes avec une agrégation et ne pas mettre les colonnes sélectionnées dans le group by.
    D'ailleurs mysql execute la requête mais en fait derrière il semble qu'il choisisse un id_commande aléatoirement...

    Quand est il du comportement sur les autres SGBD(R)?
    Et y a t il une "position officielle" de la norme sur les regroupements?

  4. #4
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Sur oracle tu ne peux pas sélectionner des colonnes avec une agrégation et ne pas mettre les colonnes sélectionnées dans le group by.
    D'ailleurs mysql execute la requête mais en fait derrière il semble qu'il choisisse un id_commande aléatoirement...

    Quand est il du comportement sur les autres SGBD(R)?
    Et y a t il une "position officielle" de la norme sur les regroupements?
    on va dire que Mysql est le seul a avoir ce genre de comportement. En effet, la requête ne devrait pas fonctionner car en cas de retour de plusieurs lignes comme c'est le cas, ce n'est pas au SGBD de choisir la valeur à remonter (donc seul MySQL a ce comportement, ce qui peut donc retourné des valeurs erronées)

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    La commande mini par client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT personne, MIN(prix) AS CdeMini
    FROM commande
    GROUP BY personne
    On joint ce résultat à la table commandes pour avoir l'id de la commande et à la table personne pour avoir le nom de la personne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT p.nom, c.id, t.CdeMini
    FROM commande c 
    INNER JOIN personne p ON c.personne = p.id
    INNER JOIN (
      SELECT personne, MIN(prix) AS CdeMini
      FROM commande
      GROUP BY personne
    ) t ON c.personne = t.personne AND c.prix = t.CdeMini
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Salut Cybher et merci pour ta réponse.
    Bon je suis rassuré sur le fait que seul mysql est adopté un tel comportement.

    Cependant je trouve ça très grave, car, loin de moi l'idée de dire que mysql est un SGBD pour débutant, je sais pertinemment que c'est faux,
    mais force est de constater, que, de part sa gratuité et sa grande disponnibilité chez les hébergeurs, mysql est un choix naturel pour débuter.

    Et permettre à des développeurs, maîtrisant mal le SQL, d'écrire de telle requête me semble bien étrange...

    Je posais la question car ce n'est pas la première fois que je vois ce genre de requêtes sur le forum et pourtant je viens juste de m'inscrire...
    Bon j'imagine que toi, depuis le temps, tu dois être un peu blasé

    @+

Discussions similaires

  1. Jointure qui ne renvoie pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 12
    Dernier message: 19/07/2024, 09h33
  2. pb jointure texture
    Par dweis dans le forum DirectX
    Réponses: 2
    Dernier message: 24/06/2003, 13h33
  3. Jointures en SQL
    Par Guizz dans le forum Langage SQL
    Réponses: 10
    Dernier message: 04/06/2003, 12h21
  4. Réponses: 14
    Dernier message: 17/03/2003, 18h31
  5. Jointures INNER et jointures classiques ???
    Par UbiK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/09/2002, 10h29

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