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 :

Pb : HAVING et sous-requete


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Pb : HAVING et sous-requete
    Bonjour a tous et merci de porter attention à mon problème.
    Cette requet me semble valide mais mysql me dit le contraire ("#1111 - Utilisation invalide de la clause GROUP"). Le problème est causé par la sous-requète de la clause HAVING qui n'est pas supportée. Si on la remplace par un nombre quelconque, ca fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT agence_code, COUNT( DISTINCT(categorie_code) ) AS nb
    FROM vehicule
    GROUP BY agence_code
    HAVING nb=(SELECT MAX(COUNT(categorie_code)) FROM categorie);
    Si besoin est, je peux vous donner la structure de ma base et accesssoirement des données de test, mais je ne pense pas que ce soit utile.

    Le but de la requete est en fait d'afficher les agences (agence_code) qui possèdent toutes les catégories de véhicule.

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Sans connaître ta version, on sait pas si les sous requêtes sont supportées ou non, mais en tout cas, la requête suivante est fautive :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(COUNT(categorie_code)) FROM categorie
    Il faudrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(categorie_code) FROM categorie
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut Re: Pb : HAVING et sous-requete
    D'après ce que je comprends de ta requête, tu peux faire un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT agence_code, COUNT(categorie_code) AS nb
    FROM vehicule
    GROUP BY agence_code
    ORDER BY nb DESC
    LIMIT 1
    Cela te retournera un enregistrement pour lequel on a COUNT(categorie_code) maximum. Par contre, si tu as plusieurs enregistrements qui sont dans ce cas, un seul sera retourné. Il faudrait que tu nous exposes ce que tu cherches à faire.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    pcaboche >> Hastaroth ne veut pas l'agence qui a le plus de catégories, mais les agences ayant toutes les catégories.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  5. #5
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Médiat
    pcaboche >> Hastaroth ne veut pas l'agence qui a le plus de catégories, mais les agences ayant toutes les catégories.
    Merci Médiat pour cette précision. Dans ce cas, c'est pas du tout ça qu'il faut faire.

    Si on a une table "categorie" qui recence les catégories disponibles, alors il faut faire un produit catésien entre "agence" et "categorie" pour connaitre toutes les combinaisons agence/catégorie possible. Ensuite, il faut faire un LEFT JOIN sur "vehicule" pour connaitre les combinaisons qui sont représentées. Enfin on fait un GROUP BY sur les agences et on ne garde que celles qui ont au moins un véhicule de chaque catégorie (condition du HAVING)

    Au final, ça donne ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT agence.*
     
    FROM agence, categorie  # Produit cartésien
     
    LEFT OUTER JOIN vehicule ON 
    (vehicule.agence_code=agence.agence_code 
    AND vehicule.categorie_code=categorie.categorie_code)
     
    GROUP BY agence.agence_code 
    HAVING AVG(IF(vehicule.agence_code IS NULL, 0, 1))=1
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Sinon tu peux aussi essayer ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT @nbCat:=COUNT(categorie_code)
    FROM categorie ;
     
     
    SELECT agence_code, COUNT( DISTINCT(categorie_code) ) AS nb
    FROM vehicule
    GROUP BY agence_code
    HAVING nb=@nbCat ;
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    C'est à dire ce que je proposais dans le deuxième post de ce fil

    Avec ORACLE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT agence_code, COUNT( DISTINCT(categorie_code) ) AS nb 
    FROM vehicule 
    GROUP BY agence_code 
    HAVING nb=(SELECT COUNT(categorie_code) FROM categorie)
    ne marche pas à cause de l'alias, il faut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT agence_code, COUNT( DISTINCT(categorie_code) ) AS nb 
    FROM vehicule 
    GROUP BY agence_code 
    HAVING COUNT( DISTINCT(categorie_code) ) = (SELECT COUNT(categorie_code) FROM categorie)
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Médiat
    C'est à dire ce que je proposais dans le deuxième post de ce fil
    ... mais sans les requêtes imbriquées (qui passent pas en MySQL 4.0). Vu qu'on ne connait pas la version utilisée...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  9. #9
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut Re: Pb : HAVING et sous-requete
    Bonjour,

    Citation Envoyé par Hastaroth
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT agence_code, COUNT( DISTINCT(categorie_code) ) AS nb
    FROM vehicule
    GROUP BY agence_code
    HAVING nb=(SELECT MAX(COUNT(categorie_code)) FROM categorie);
    Pour information, il n'est JAMAIS possible de faire une chose comme celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MAX(COUNT(categorie_code))
    C'est une erreur plutot courante, mais qu'on ne devrait pas faire. COUNT renvoit un nombre. MAX ne travaillant que sur un ensemble, il ne peut pas interpréter le nombre.
    Pensez au tag

  10. #10
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Version de MySql : MySQL 4.1.9 donc sous requetes supportées
    Et effectivement ma sous requète était fausse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(COUNT(categorie_code)) FROM categorie
    Faut dire qu'à l'heure ou je bossais là dessus, j'avais pu les idées très claires. Mais le principe que j'utilisait était juste. En tout cas j'ai résolu mon problème de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT agence_code
    FROM vehicule
    GROUP BY agence_code
    HAVING COUNT(DISTINCT(categorie_code)) = 
      (SELECT MAX( nb )
      FROM (SELECT COUNT( categorie_code ) AS nb
                FROM categorie) AS tabNb)
    Je vous remercie tous pour votre aide. En particulier Médiat sans qui je ne me serais peut-etre pas rendu compte de mon erreur. Merci à tous. Problème résolu.

  11. #11
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    As-tu essayé la requête que je t'ai proposé ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT COUNT( categorie_code ) AS nb 
    FROM categorie
    ne ramène qu'une seule ligne, à quoi sert le MAX que tu calcules après ??
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

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

Discussions similaires

  1. [MySQL 4] Sous Requete IN .. SELECT ...
    Par pataluc dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/09/2004, 15h54
  2. Problème sous requete MySQL
    Par gavelin dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/07/2004, 10h36
  3. [Débutante]Sous requete
    Par mimi74 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/07/2004, 14h02
  4. probleme de sous requete
    Par JD_Lyon dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 09/04/2004, 22h18
  5. Requete avec une sous-requete... Ne fonctionne qu'a moitie..
    Par mythtvtalk.com dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 18/08/2003, 09h54

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