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 :

requête SQL incomprise


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut requête SQL incomprise
    Slt à tous,

    j'aimerais que vous m'aidiez à comprendre cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select redacteur
    From PARUTION
    Group by redacteur
    Having count (*) >= all (select (count(*))
                               From PARUTION
                               Group by redacteur)
    Elle est censée m'afficher le(s) redacteur(s) ayant le plus participé à la conception des parutions mais je ne comprends pas pourquoi elle a été faite de cette maniere.

    Peut être une mauvaise compréhension du count(*)...
    Merci d'avance

  2. #2
    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,

    Qu'est-ce qui vous dérange exactement ?

    .

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut
    je ne comprend tt simplement pas la requête.
    le having count(*) par ex ,je ne sais pas si il permet de faire une condition sur le nombre de lignes dans le champ redacteur ou la table entiere ?

    Voila ce que je comprends:

    le nombre de ligne dans le champ redacteur doit être >ou = au nombre de redacteur en comptant egalement les doublons(all(select count(*))) ce qui n'a rien à voir au résultant attendu.

    Merci de m'eclairer

  4. #4
    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
    Imagine (On va se tutoyer )

    Dans la colonne rédacteur tu as...

    redacteur
    Lovecraft
    King
    Clark
    Lovecraft
    Lovecraft
    La requête te renverra "Lovecraft"

    le having count(*) par ex ,je ne sais pas si il permet de faire une condition sur le nombre de lignes dans le champ redacteur ou la table entiere ?
    Quelle différence vois tu, la sélection se passe sur la colonne (et non le champs) rédacteur !

    Pour moi cela retourne le(s) rédacteur(s) (Du fait du = en plus) qui apparaît le plus souvent dans la colonne...

    Donc
    Elle est censée m'afficher le(s) redacteur(s) ayant le plus participé à la conception des parutions
    C'est effectivement le cas !


  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut
    pourquoi garder le ALL dans la condition "having" est il necessaire?
    ya t'il une autre facon d'avoir ce resultat ?

    Merci dton aide

  6. #6
    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
    pourquoi garder le ALL dans la condition "having" est il necessaire?
    Ben tout est lié... et il y a une fonction d'agrégat !

    Alors comme il faut aussi que l'on bosse et qu'il se fait tard

    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
    USE DB_TEST
    GO
     
    CREATE TABLE redacteur
    (
    ID_numero INT NOT NULL,
    yup_number INT NOT NULL,
    date_creation DATETIME NOT NULL,
    nom CHAR(20) NOT NULL,
    prenom VARCHAR(20) NOT NULL
    )
    -- Je passe mail et id_manager ^^
    GO
     
    INSERT INTO redacteur values (1, 0001, '20090101 12:31:28', 'Toto', 'Blop')
    INSERT INTO redacteur values (2, 0002, '20090101 12:31:28', 'Tata', 'Blap')
    INSERT INTO redacteur values (3, 0003, '20090701 12:31:28', 'Titi', 'Blip')
    INSERT INTO redacteur values (4, 0003, '20090901 12:31:28', 'Titi', 'Blip')
    INSERT INTO redacteur values (5, 0001, '20090401 12:31:28', 'Tata', 'Blap')
    INSERT INTO redacteur values (6, 0003, '20090201 12:31:28', 'Toto', 'Blop')
    INSERT INTO redacteur values (7, 0002, '20090301 12:31:28', 'Toto', 'Blop')
    INSERT INTO redacteur values (8, 0001, '20091001 12:31:28', 'Tata', 'Blap')
    GO
    Le fait d'avoir le = donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT nom
    FROM redacteur
    GROUP BY nom
    HAVING count (*) >= ALL (SELECT (count(*))
                               FROM redacteur
                               GROUP BY nom)
    Résultat
    Nom
    Tata
    Toto
    Ajoutons un Toto
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO redacteur values (9, 0001, '20091101 12:31:28', 'Toto', 'Blop')
    Avec la même requête:
    Nom
    Toto
    Peut-être y a t-il une solution plus simple mais, là je passe la main car plus d'idée ce soir, trop fatigué


  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Le ALL est nécessaire car dans la requête il y a un count(*) certes mais aussi un grouping par rédacteur. De ce fait, cette requête renvoie le nombre de parution par rédacteur mais sans afficher ce dernier.

    Comme vous cherchez le rédacteur qui a participté au plus de parutions, vous cherchez le rédacteur dont le nombre de parutions est supérieur ou égal au nombre de parutions de tous les rédacteur.

  8. #8
    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
    Bonsoir waldar ,

    Y aurait-il une solution plus simple car j'y ai réfléchi brièvement mais je vois pas ...!


  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Comme vous cherchez le rédacteur qui a participté au plus de parutions, vous cherchez le rédacteur dont le nombre de parutions est supérieur ou égal au nombre de parutions de tous les rédacteur.
    je veux pas forcer mais la requête suivante peut aussi bien afficher le nombre de parution pour tout les redacteurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select count(*)
    from parution
    group by redacteur
    -----------------------------------------
    Pour faire plus simple supposons qu'on ait cette colonne:

    redacteur
    mouloud
    mouloud
    jacques
    jacques
    jacques
    pierre
    En executant la requête,grâce au having count(*), le sgbd va comparer ce tableau :
    2
    3
    1
    à un autre tableau, cette fois grâce au select imbriqué all(select count(*)...), dont j'aimerai avoir le resultat sous forme de tableau ce sra je pense plus simple pour le que je suis.
    J'arrive pas à passer à autre chose ...

    Merci de votre patience

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Il y a plein d'autres méthodes pour arriver au même résultat.

    Mais est-ce que vous cherchez une autre méthode ou bien est-ce que vous essayez de comprendre pourquoi celle-ci fonctionne, ce sont deux questions différentes !

  11. #11
    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
    Bonsoir Waldar,

    Heu, ben pour ma part je voudrais trouver quelque chose de plus simple mais pas de résultat ... Et je comprends très bien la requête citée


  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    Littéralement cette requête dit ceci :

    Chercher les redacteurs (SELECT redacteur) dans les parutions (FROM PARUTION) pour lesquels (GROUP BY redacteur) le nombre de rédacteur (HAVING count (*)) est supérieur ou égal a tous (>= ALL) les comptages (count(*)) de rédacteur (GROUP BY redacteur) dans les parutions (FROM PARUTION).

    Cette requête que je donne en cours est équivalent à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT redacteur
    FROM   PARUTION
    GROUP  BY redacteur
    HAVING count (*) = (SELECT MAX(N)
                        FROM   (SELECT count(*) AS N
                                FROM PARUTION
                                GROUP BY redacteur) AS T)
    Qui elle même signifie :

    Chercher les redacteurs (SELECT redacteur) dans les parutions (FROM PARUTION) pour lesquels (GROUP BY redacteur) le nombre de rédacteur (HAVING count (*)) est égal au maximum (SELECT MAX(N)) ses comptage (count(*)) de rédacteur (GROUP BY redacteur) dans les parutions (FROM PARUTION).

    Autrement dit on cherches les rédacteurs ayant le plus fait de parutions.

    A +

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Vu qu'il s'agit de la même table, on peut faire plus simple comme trier par le nombre de parutions et se limiter au premier résultat.

    Ca pourrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT redacteur, count(*)
    FROM   PARUTION
    GROUP  BY redacteur
    ORDER BY count(*) desc
    LIMIT 1
    Ou avec les fonctions analytiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT SR.redacteur
    FROM
    (
    SELECT redacteur, count(*), rank() over(order by count(*) desc) as rk
    FROM   PARUTION
    GROUP  BY redacteur
    ) SR
    where SR.rk = 1

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    Sauf que LIMIT n'existe pas en SQL (c'est une merdouille propre à MySQL) . En revanche les fonctions de fenêtrage oui !

    A +

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

Discussions similaires

  1. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/07/2024, 15h41
  2. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 19h42
  3. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  4. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37

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