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

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Août 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 2
    Points : 1
    Points
    1
    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 éprouvé
    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
    Points : 965
    Points
    965
    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 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    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 sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    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

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    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é

    @+

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    S'il n'y avait que celle là.. Mais les passoires MySQL il y en a des tonnes. Le problème c'est quand les mysqlistes arrivent sur des SGBDR plus propre, il n'arrivent plus à écrire des requêtes...

    A +

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Août 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    merci pour votre aide.
    Est ce que la requete suivante serai correcte ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT p.id, p.nom, c.id, c.prix
    FROM personne p
    LEFT JOIN commande c ON c.personne = p.id
    	and c.prix = (select min(cc.prix) from commande cc inner join personne p on	cc.personne=p.id group by cc.personne)

  9. #9
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Ca me chiffonne de voir des noms de Tables égals à des noms de colonnes...


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, 10h33
  2. pb jointure texture
    Par dweis dans le forum DirectX
    Réponses: 2
    Dernier message: 24/06/2003, 14h33
  3. Jointures en SQL
    Par Guizz dans le forum Langage SQL
    Réponses: 10
    Dernier message: 04/06/2003, 13h21
  4. Réponses: 14
    Dernier message: 17/03/2003, 19h31
  5. Jointures INNER et jointures classiques ???
    Par UbiK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/09/2002, 11h29

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