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 :

Sélection des 5 derniers par catégorie


Sujet :

Langage SQL

  1. #1
    Rédacteur

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 494
    Points : 1 057
    Points
    1 057
    Par défaut Sélection des 5 derniers par catégorie
    Bonjour tout le monde,

    tout d'abord, je m'excuse pour le titre vague que j'ai pu donner, mais je ne savais pas trop comment exprimer mon problème.

    Bon tout d'abord, voici un aperçu de la table sur laquelle je travaille :


    En fait, j'aimerai sélectionner les titres des 5 derniers tutos pour chaque Categorie (colonne cat). Est-il possible de faire ça en une seule requête SQL ?

    Merci pour votre aide,
    Finality

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Finality Voir le message
    les titres des 5 derniers tutos pour chaque Categorie (colonne cat).
    Derniers selon quel critère ?
    Sans notion d'ordre ou de date dans la table, c'est impossible.
    Sinon il y a déjà eu des problèmes similaires posés.
    Un peu de recherche dans le forum ne devrait pas prendre énormément de temps.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Rédacteur

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 494
    Points : 1 057
    Points
    1 057
    Par défaut
    Salut CinePhil,

    je sais et j'utilise avant chacun de mes posts le moteur de recherche. Néanmoins sur un tel sujet, j'ai beau taper des mots vagues je trouve pas ce que je recherche

    Pour le tri ce serait sur le Titre

    Je te remercie pour ton aide

    Finality

  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
    Bonjour,
    CinePhil ,

    Ce que voulez dire CinePhil, c'est quel critère détermine que ce soit bien les 5 derniers titres que l'on récupère ?

    Avez vous un numéro d'ordre ou une date qui permettrait de déterminer les derniers tutos insérés dans votre table...

    Postez vos DDL de vos tables, cela sera plus simple pour nous !

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  5. #5
    Rédacteur

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 494
    Points : 1 057
    Points
    1 057
    Par défaut
    Bonjour,

    pour le critère, la table possède une colonne "DatePost" qui correspond à la date à laquelle le tuto a été posté.

    Sinon, comment extraire le DDL à partir de MySQL (je suis pas un pro des bases de données) ?

    Merci pour votre aide

    Finality

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    (et tout particulièrement à Chtulhus )

    ... il faut également le SGBD !

    Si ton sgbd implémente les fonctions analytiques, ça sera facile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT ROW_NUMBER() OVER(PARTITION BY cat ORDER BY Titre DESC) AS TonRang, Titre, Cat
    FROM TaTable
    Ca attribue pour chaque ligne son "numéro" dans le groupement par catégorie, selon l'ordre alphabétique "titre".
    Donc pour garder les 5 premier de chaque catégorie, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT Cat, Titre FROM (
    SELECT ROW_NUMBER() OVER(PARTITION BY cat ORDER BY Titre DESC) AS TonRang
    FROM TaTable)
    WHERE TonRang <= 5
    Si ton SGBD ne prend pas les fonctions analytique, réfléchit très fort pour formuler ton problème de la bonne manière.
    Par exemple :
    "je veux l'ensemble des lignes pour lesquelles le nombre de lignes de la même catégorie ayant un titre plus grand que le sien est inférieur à 5"

    Tente d'écrire la requête correspondant, si t'y arrives pas on t'aidera

    [EDIT]
    Bon ben entre temps tu as donné pleins d'info...
    Comme t'es en MySQL, t'as pas les fonctions analytiques : réfléchis à la deuxième méthode.
    (et mon ORDER BY Titre DESC aurait de toutes façons dû être remplacé par ORDER BY DatePost DESC)

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  7. #7
    Rédacteur

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 494
    Points : 1 057
    Points
    1 057
    Par défaut
    Salut pacmann !

    Comme d'après ce que tu m'as dit, MySQL ne gére pas les focntions analytiques, je me suis penché sur ta deuxième solution.

    Je précise que maintenant, je voudrais les 5 pour chaque catégorie en fonction de la date de publication.

    Donc voilà la requête que j'ai créé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT Id, Cat
    FROM tuto AS t
    WHERE (
     
    SELECT COUNT( Id )
    FROM tuto
    WHERE Date >= t.Date
    AND Cat = t.Cat
    AND Id <> t.Id
    ) <5
    ORDER BY Cat, Date DESC
    Pour le moment, cette requête marche à merveille. Mais imaginons maintenant que j'ai 6 enregistrements concernant la catégorie 1. Sur ces 6 enregistrements, 4 on été publiés à la même date, et les deux autres à une date postérieure.

    Si j'applique ma requête, je ne vais obtenir que les deux derniers enregistrements. Comment résoudre ce problème ?

    Je vous remercie pour votre aide,

    Finality

    EDIT :

    Bon alors je me suis penché sur ce problème, et je me suis dit qu'en plus de la date, il fallait un critère de tri. J'ai donc choisi de trier en deuxième recours sur le Titre, au cas où les tutos soient publiés à la même date. Voilà la requête que j'obtiens :

    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
     
    SELECT Id, Cat
    FROM tuto AS t
    WHERE (
     
    SELECT COUNT( Id )
    FROM tuto
    WHERE Date >= t.Date
    AND Cat = t.Cat
    AND Id <> t.Id
    ) - (
    SELECT COUNT( Id )
    FROM tuto
    WHERE Date = t.Date
    AND Cat = t.Cat
    AND Titre < t.Titre ) <5
    ORDER BY Cat, Date DESC
    Qu'en pensez vous ?

  8. #8
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Pas mal, pas mal !

    Cela dit, s'il te faut un ordre absolu, j'aurais simplement ajouté l'Id dans le critère de comparaison.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT Id, Cat
    FROM tuto AS t
    WHERE (
     
    SELECT COUNT( Id )
    FROM tuto
    WHERE (Date > t.Date OR (Date = t.Date And Id > t.id))
    AND Cat = t.Cat
    AND Id <> t.Id
    ) <5
    ORDER BY Cat, Date DESC

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  9. #9
    Rédacteur

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 494
    Points : 1 057
    Points
    1 057
    Par défaut
    Salut Pacman,

    désolé pour le retard mais j'ai été un peu pris ces derniers temps. Ta requête fonctionne à 100% et est bien mieux optimisée que la mienne .

    Je vous remercie à tous pour votre aide .

    Bonne soirée
    Finality

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

Discussions similaires

  1. Liste exhaustive des API J2EE par catégorie
    Par miltone dans le forum Java EE
    Réponses: 7
    Dernier message: 17/02/2013, 17h03
  2. web part permettant de publier des petites annonces par catégories
    Par vpxavier dans le forum Développement Sharepoint
    Réponses: 1
    Dernier message: 10/02/2010, 09h11
  3. Sélection des 7 derniers jours sur une table de faits
    Par Fatah93 dans le forum SAS Base
    Réponses: 4
    Dernier message: 27/04/2009, 13h48
  4. Réponses: 6
    Dernier message: 12/04/2007, 18h13
  5. Sélection des fichiers par date
    Par bramy dans le forum Linux
    Réponses: 1
    Dernier message: 06/12/2006, 19h10

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