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 possible?


Sujet :

Langage SQL

  1. #1
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut Requête SQL possible?
    Bonjour,
    j'aurais aimé votre avis sur la faisabilité d'une requête (quasi sûr que c'est possible, mais je n'y arrive pas).

    J'ai une table d'observations avec comme identifiant unique id_poi. Chaque observation est liée à une commune.
    id_poi, commune_id_commune
    J'ai une table qui permet d'enregistrer des votes sur ces observations associant l'adresse e-mail d'une personne
    vote_id, id_poi


    J'aimerais pour toutes les communes ne ressortir que le top 5 des observations les plus votées....j'en suis là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT count(*) as nb_votes, poi_poi_id, lib_commune 
    			FROM `votes` 
    			INNER JOIN poi ON poi.id_poi = votes.id_poi
    			INNER JOIN commune ON poi.commune_id_commune = commune.id_commune 
    			GROUP BY poi_poi_id 
    			ORDER BY commune.lib_commune ASC, nb_votes DESC, poi.id_poi ASC
    mais bien entendu, ça me ressort toutes les observations avec le nombre de votes associés et je dois filtrer côté langage de programmation....j'aimerais le faire côté SQL.
    je ne trouve pas de clause having to qui ferait ce que je veux...

    Merci d'avance pour vos lumières

    Gérald

    PS : je suis sur MariaDB 10

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    As-tu d'essayer d'ajouter une clause LIMIT après la clause ORDER BY?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT count(*) as nb_votes, poi_poi_id, lib_commune
    FROM `votes`
    INNER JOIN poi ON poi.id_poi = votes.id_poi
    INNER JOIN commune ON poi.commune_id_commune = commune.id_commune
    GROUP BY poi_poi_id
    ORDER BY commune.lib_commune ASC, nb_votes DESC, poi.id_poi ASC
    LIMIT 5

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    bonjour

    autre solution : utiliser une fonction OLAP et ne conserver que les 5 premiers

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    As-tu d'essayer d'ajouter une clause LIMIT après la clause ORDER BY?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT count(*) as nb_votes, poi_poi_id, lib_commune
    FROM `votes`
    INNER JOIN poi ON poi.id_poi = votes.id_poi
    INNER JOIN commune ON poi.commune_id_commune = commune.id_commune
    GROUP BY poi_poi_id
    ORDER BY commune.lib_commune ASC, nb_votes DESC, poi.id_poi ASC
    LIMIT 5
    Encore une fois LIMIT ne fait pas partie du SQL et possède de nombreux effets de bord !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    En SQL :

    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
    WITH 
    T AS
    (
    SELECT COUNT(*) AS nb_votes, 
           DENSE_RANK() OVER(ORDER BY COUNT(*) DESC)  AS RANG,
           poi_poi_id, 
           lib_commune
    FROM   votes
           INNER JOIN poi 
              ON poi.id_poi = votes.id_poi
           INNER JOIN commune 
              ON poi.commune_id_commune = commune.id_commune
    GROUP  BY poi_poi_id
    )
    SELECT *
    FROM   T_EMPLOYEE_EMP
    WHERE  RANG <= 5;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    En SQL
    C'est in extenso ce que je proposai plus haut
    Autre avantage comparativement à l'utilisation de LIMIT, en cas d'ex aeoquo, LIMIT choisira arbitrairement l'un des ex-aequo, contrairement à la solution basée sur DENSE_RANK() :

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Autre avantage comparativement à l'utilisation de LIMIT, en cas d'ex aeoquo, LIMIT choisira arbitrairement l'un des ex-aequo, contrairement à la solution basée sur DENSE_RANK() :
    Cela dépend si on veut strictement 5 lignes ou pas. D'après la doc MariaDB, je vois que la clause LIMIT n'a pas d'options "WITH TIES"...

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Cela dépend si on veut strictement 5 lignes ou pas. D'après la doc MariaDB, je vois que la clause LIMIT n'a pas d'options "WITH TIES"...
    Non, ça ne dépend pas.... La demande d'information ne répond pas à des données retrouvées arbitrairement !
    Lorsque l'on demande les 5 premiers, il peut y avoir 1, 2, 3, 4, 5, 6, 7.... lignes en réponse !

    Ce n'est pas la même chose que de demander 5 lignes au hasard s'il y a des ex aequo.....

    je rappelle que sur un podium de compétition sportive, il peut y avoir plus de 3 personnes, ou moins de 3 personnes...
    Quelques exemples :

    4 ex æquo en première place, pas de second ni de 3e

    Nom : 4 ex aequo en première place.jpg
Affichages : 182
Taille : 84,9 Ko


    et celui là plus classique :

    Nom : Podium avec 4 b.jpg
Affichages : 185
Taille : 143,4 Ko

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Je parlais de la demande initiale. Ce n'est pas précisé s'il faut les ex æquo ou pas. C'est bien d'ailleurs pour cela que la clause TOP propose l'option WITH TIES non (qui n'est pas l'option par défaut d'ailleurs si je ne me trompe pas)?

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Je parlais de la demande initiale. Ce n'est pas précisé s'il faut les ex æquo ou pas. C'est bien d'ailleurs pour cela que la clause TOP propose l'option WITH TIES non (qui n'est pas l'option par défaut d'ailleurs si je ne me trompe pas)?
    Oui, mais elle ne répond toujours pas à la spécification des n premiers... Puisqu'elle ne concerne que les lignes identique à partir de la dernière ligne et non une gestion complète des ex æquo

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  11. #11
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    Merci pour vos retours.
    Je teste ça dès ce soir!
    Il me faut en effet un nombre identique de résultats pour toutes les catégories

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/11/2015, 09h36
  2. est ce possible de mettre une requête sql en javascript
    Par mioke dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/04/2008, 11h35
  3. Réponses: 7
    Dernier message: 08/02/2008, 10h35
  4. [MySQL] Est-ce possible de creer des champs en temps réel lors d'une requête SQL ?
    Par kaptnkill dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/09/2006, 19h18
  5. Requte Sql Avancée, question ... ? Estce possible ?
    Par plex dans le forum Administration
    Réponses: 8
    Dernier message: 14/12/2005, 15h13

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