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 :

Limiter le nombre de résultats d'une requete


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 35
    Points
    35
    Par défaut Limiter le nombre de résultats d'une requete
    Bonsoir,

    j'ai la table suivante :
    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
    mysql> select * from maTable4;
    +-------------+------------+-------+---------+----------+
    | identifiant | journee    | valid | invalid | sourceId |
    +-------------+------------+-------+---------+----------+
    |           1 | 27/11/2007 |    10 |      20 |        1 |
    |           2 | 27/11/2007 |    15 |      25 |        2 |
    |           3 | 28/11/2007 |    25 |      30 |        1 |
    |           4 | 28/11/2007 |    50 |      25 |        2 |
    |           5 | 25/11/2007 |    45 |      25 |        1 |
    |           6 | 27/11/2007 |    15 |      25 |        1 |
    |           7 | 29/11/2007 |    15 |      35 |        1 |
    |           8 | 29/11/2007 |    35 |      15 |        2 |
    |           9 | 30/11/2007 |    45 |       5 |        1 |
    +-------------+------------+-------+---------+----------+
    9 rows in set (0.00 sec)
    J'ai exécuté la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mysql> select identifiant, journee from maTable4 ORDER BY journee DESC LIMIT 3; 
    +-------------+------------+
    | identifiant | journee    |
    +-------------+------------+
    |           9 | 30/11/2007 |
    |           7 | 29/11/2007 |
    |           8 | 29/11/2007 |
    +-------------+------------+
    3 rows in set (0.00 sec)
    En faite, ce que je souhaite obtenir, ce n'est pas de limiter le nombre de résultats à 3 lignes mais plutôt de limiter l'affichage des résultats à 3 dates.
    La requête souhaitée fournira comme résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    +-------------+------------+
    | identifiant | journee    |
    +-------------+------------+
    |           9 | 30/11/2007 |
    |           7 | 29/11/2007 |
    |           8 | 29/11/2007 |
    |           3 | 28/11/2007 |
    |           4 | 28/11/2007 |
    +-------------+------------+
    5 rows in set (0.00 sec)
    J'essaye depuis cet après-midi d'arriver à cet affichage mais sans succès.
    Si quelqu'un pouvait m'indiquer la manière de procéder?

    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 52
    Points : 59
    Points
    59
    Par défaut
    Bonsoir,

    Pourquoi ne pas faire un where dans la requête ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT identifiant, journee FROM maTable4 WHERE date between datedebut datefin ORDER BY journee
    En espèrant avoir pu d'aider.
    C'est au pied du mur que l'on voit le mieux le mur!!!!!

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par ythierrin Voir le message
    Bonsoir,

    Pourquoi ne pas faire un where dans la requête ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT identifiant, journee FROM maTable4 WHERE date between datedebut datefin ORDER BY journee
    En espèrant avoir pu d'aider.
    Bonsoir,

    Mais comment procéder dans le cas ou la date de début et de fin n'est pas connu ? J'ai besoin de savoir les données correspond aux 3 dernières dates qui sont dans la table mais sans avoir à préciser dans la requete intervalles précis de date. Je ne sais pas si je suis clair mais il faut que la requete soit générale.
    Dans mon cas, c'est des dates mais ça peut très bien être des entiers dont il faudrait avoir les 3 derniers ...

  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
    salut,

    je n'ai pas de quoi tester mais je te propose ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from table4 where journee in 
    (select journee from table4 group by journee order by journee desc limit 3);
    A tester

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par Cybher Voir le message
    salut,

    je n'ai pas de quoi tester mais je te propose ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from table4 where journee in 
    (select journee from table4 group by journee order by journee desc limit 3);
    A tester
    Merci pour la proposition de réponse. Je testerai demain car je ne peux également pas tout de suite.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 848
    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 848
    Points : 52 964
    Points
    52 964
    Billets dans le blog
    6
    Par défaut
    Il vous faut une sous requête avec un HAVING count(DISTINCT LaDate) = 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/ * * * * *

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 105
    Points : 90
    Points
    90
    Par défaut je te propose cette méthode
    salut
    je pense que j'ai une idée mais je vais pas le développer qu'après que tu essayes ce qu'ils t'ont communiquer les amis.

    méthode :
    1- tu déclare un cursor : @mycursor
    2- tu va pointer le curseur sur la première ligne des enregistrement ( à l'envers en utilisant order by datexx desc);
    3- tu stock la première date récupérer dasn une variable de type datetime;
    4- tu incrémente un compteur de type entier par 1;
    5- tu avance d'un pas ton curseur et tu test la date récupérer avec la date dèjà stocké si elles sont les même tu avance d'1 pas sans incrémenter le compteur.
    6- si ton compteur arrive à la valeur 3 (3 date différentes )
    alors t'as réussi à retourner tous les enregistrement qui correspond à ces 3 date.

    si tu intéréssé tu me demande de te fournier le code .

  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 848
    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 848
    Points : 52 964
    Points
    52 964
    Billets dans le blog
    6
    Par défaut
    Un curseur est inutile et contre performant alors qu'une seule requête suffit.

    Si vous voulez que l'on vous écrive la requête commencez par respecter la charte de postage.
    http://www.developpez.net/forums/ann....php?f=37&a=69

    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 averti

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Points : 328
    Points
    328
    Par défaut
    Citation Envoyé par Cybher Voir le message
    salut,

    je n'ai pas de quoi tester mais je te propose ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from table4 where journee in 
    (select journee from table4 group by journee order by journee desc limit 3);
    A tester
    +1
    A ceci près qu'un distinct au lieu du group by dans la sous-requête me semble plus simple.

    L'utilisation du curseur me semble bien compliquée par rapport à une simlpe requête

  10. #10
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 032
    Points : 23 767
    Points
    23 767
    Par défaut
    Citation Envoyé par Cybher Voir le message
    salut,

    je n'ai pas de quoi tester mais je te propose ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from table4 where journee in 
    (select journee from table4 group by journee order by journee desc limit 3);
    A tester
    C'est une bonne idée, mais vu que le SGBD a l'air d'être MySQL et que ce dernier n'accepte pas encore la clause LIMIT dans une sous-requête introduite par un IN, ça risque de ne pas marcher...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  11. #11
    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 ced Voir le message
    C'est une bonne idée, mais vu que le SGBD a l'air d'être MySQL et que ce dernier n'accepte pas encore la clause LIMIT dans une sous-requête introduite par un IN, ça risque de ne pas marcher...

    ced
    En effet, je n'avais pas fait attention au SGBD

  12. #12
    Membre averti

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Points : 328
    Points
    328
    Par défaut
    Citation Envoyé par ced Voir le message
    C'est une bonne idée, mais vu que le SGBD a l'air d'être MySQL et que ce dernier n'accepte pas encore la clause LIMIT dans une sous-requête introduite par un IN, ça risque de ne pas marcher...

    ced
    Effectivement, c'est dommage...
    C'est le seul cas où le LIMIT n'est pas supporté ??
    Parce qu'on peut imaginer un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select t4.* from table4 t4,
    (select distinct journee from table4 order by journee desc limit 3) sr
    where t4.journee=sr.journee

  13. #13
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 032
    Points : 23 767
    Points
    23 767
    Par défaut
    Citation Envoyé par marchand_de_sable Voir le message
    C'est le seul cas où le LIMIT n'est pas supporté ??
    LIMIT n'est pas supporté dans les sous-requêtes introduites par IN, EXISTS, ANY et SOME.
    Citation Envoyé par marchand_de_sable Voir le message
    Parce qu'on peut imaginer un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select t4.* from table4 t4,
    (select distinct journee from table4 order by journee desc limit 3) sr
    where t4.journee=sr.journee
    En SQL2 (si il y a d'autres conditions à rajouter dans le WHERE, ça sera plus lisible ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select t4.* from table4 t4
    INNER JOIN 
    (select distinct journee from table4 order by journee desc limit 3) as sr
    ON t4.journee=sr.journee
    Comme on dit souvent en informatique : "Là, ça devrait marcher" .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  14. #14
    Membre averti

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Points : 328
    Points
    328
    Par défaut
    Citation Envoyé par ced Voir le message
    LIMIT n'est pas supporté dans les sous-requêtes introduites par IN, EXISTS, ANY et SOME.
    Merci pour l'info.

    Citation Envoyé par ced Voir le message
    En SQL2 (si il y a d'autres conditions à rajouter dans le WHERE, ça sera plus lisible
    Tout à fait d'accord...désolé pour ma syntaxe désuète

  15. #15
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 105
    Points : 90
    Points
    90
    Par défaut SQLpro
    merci pour ta réponse sympa !!!!!!!!!??????????

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par Cybher Voir le message
    salut,

    je n'ai pas de quoi tester mais je te propose ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from table4 where journee in 
    (select journee from table4 group by journee order by journee desc limit 3);
    A tester
    Désolé de ne pas avoir répondu avant mais j'avais quelques soucis de connection
    En effet, j'utilise mysql 4 et le code tel que tu l'avais écrit ne fonctionnait pas mais en le faisant en 2 requetes, dans mon cas dans un programme perl, j'ai pu obtenir le résultat que je voulais.

  17. #17
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 032
    Points : 23 767
    Points
    23 767
    Par défaut
    Bonjour,

    Tu peux le faire en une seule requête, à condition que ta version de MySQL soit au moins 4.1 (pour accepter les sous-requêtes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *
    FROM
      (SELECT journee
       FROM maTable4
       GROUP BY journee
       ORDER BY journee
       DESC LIMIT 3) as t1
    INNER JOIN
      (SELECT * from maTable4) as t2 on t1.journee = t2.journee
    Sinon, c'est par du code Perl...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

Discussions similaires

  1. Affichage nombre de résultat d'une requete
    Par eiffel74 dans le forum Langage
    Réponses: 1
    Dernier message: 26/03/2014, 18h56
  2. Réponses: 2
    Dernier message: 21/04/2008, 15h08
  3. Limiter le nombre de résultats sur une page
    Par yazen dans le forum ASP.NET
    Réponses: 7
    Dernier message: 04/09/2007, 23h13
  4. limite du nombre de caractères dans une requete
    Par pheno82 dans le forum Access
    Réponses: 3
    Dernier message: 01/06/2006, 22h12
  5. Réponses: 2
    Dernier message: 13/03/2005, 14h10

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