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 :

Ne récupérer que des résultats d'auteur différents


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 9
    Points
    9
    Par défaut Ne récupérer que des résultats d'auteur différents
    Bonjour à tous,

    je vous remercie d'avance pour le temps que vous prendrez à lire cette interrogation, et de l'aide que vous pourrez m'apporter.

    J'ai un forum sur lequel je souhaite afficher les derniers posts poster par les membres.
    J'ai la requête suivante qui fonctionne parfaitement (jointure avec la table des membres et jointure avec la table des topic du forum) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * FROM  forum_post fp 
    INNER JOIN pdf_membre m ON m.idmembre = fp.post_createur
    INNER JOIN forum_topic ft ON ft.topic_id = fp.topic_id
    WHERE post_forum_id != 9 AND post_forum_id != 11 ORDER BY post_time DESC LIMIT 10
    Vu que c'est un petit forum, il arrive parfois que les 20 derniers commentaires soient postés par le même membre.
    Je souhaiterais que la sélection ne prenne qu'un seul résultat par membre...

    Si j'utilise un distinct, je ne peux pas faire d'order by désiré, et j'ai essayé d'imbriquer mais je rame....

    quelqu'un aurait une idée ?

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Pour commencer, un SELECT * est à proscrire en production.

    Pour la question originale, je pense qu'il faut chercher le dernier commentaire par membre.

    Tatayo.

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il existe une solution relativement simple mais à base de fonctions fenêtrées, or vous semblez être sous MySQL. Est-ce bien le cas ? si oui, quelle version ?

    En prenant en compte la remarque de Tatayo et en effectuant une recherche, vous trouverez pléthore de solutions sur ce forum.

  4. #4
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Bonjour,

    Tu peux ajouter dans le where :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and fp.post_time  = (select max(post_time) from forum_post where forum_post.post_createur = m.idmembre)
    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Merci à tous les 3 pour vos retours.

    Pour compléter ma demande... je travaille effectivement sous php et mysql (peut-être ne suis-je pas au bon endroit, mais j'ai beaucoup de mal à me retrouver sur ce forum pour le moment)
    PHP 7 et Mysql 5.7 je crois.


    Tatayo, qu'entends-tu lorsque tu dis qu'un select est à proscrire en développement... si je ne mets pas de select ma requête ne peut pas fonctionner ?


    aieeeuuuuu, j'ai essayé une recherche, mais je ne dois pas faire les bonnes demandes, et vu la quantité de forum, j'ai l'impression qu'il y a des articles dans les réponses, (je suis vraiment perdu, j'ai honte de l'écrire, mais c'est la réalité)

    Bloon, si je comprends bien ce que tu me propose d'ajouter au WHERE une requete imbriquée qui récupèrerait le dernier post pour chaque post du même membre (l'idée me parait bonne, je vais voir si je trouve la bonne syntaxe, car pris tel quel mon mysql voit rouge....)

    Merci

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Citation Envoyé par rickways Voir le message
    Tatayo, qu'entends-tu lorsque tu dis qu'un select est à proscrire en développement... si je ne mets pas de select ma requête ne peut pas fonctionner ?
    Ce n'est pas le select mais le select * qui est à proscrire.
    • Parce que toutes les colonnes de la table ou vue ne sont pas toujours nécessaires à récupérer.
    • Parce que l'ordre des colonnes peut se trouver modifié dans la structure de la table.
    • Parce que des colonnes peuvent être ajoutées ou retirées dans la table.
    • ...

    .
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Bonjour,

    Une autre piste sinon, dans le FROM :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INNER JOIN (select max(post_time) as max_date, post_createur from forum_post group by post_createur) as max_createur
               on fp.post_createur = max_createur.post_createur and max_createur.max_date = fp.post_time
    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Alors là BLOON, je reste sur le derrière, je n'arrive même pas à comprendre toute la logique de la requête, je ne sais pas si j'aurai trouvé tout seul, mais elle fonctionne parfaitement... (il y a vraiment des surdoués du code)

    Merci beaucoup!

    Eric

  9. #9
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    C'est quand même mieux de comprendre :-)

    Le principe c'est de créer une sous-requête qui sert à filtrer le résultat via une jointure. C'est d'ailleurs mieux de faire ça dans une clause WITH mais je ne sais pas si MySQL implémente le with.

    Pour la sous-requête elle-même c'est assez simple : elle récupère la date de post max par auteur (max date + group by auteur). En faisant la jointure sur ces deux informations, on ne conserve que les lignes correspondant au post max de chaque auteur.

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Bloon Voir le message
    Le principe c'est de créer une sous-requête qui sert à filtrer le résultat via une jointure. C'est d'ailleurs mieux de faire ça dans une clause WITH mais je ne sais pas si MySQL implémente le with.
    MySQL n'a implémenté les Common Table Expression (CTE) que depuis la V8, c'est à dire tout récemment

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Merci pour les explications,

    effectivement, je ne connaissais pas max(), que je découvre... et qui permet donc de ne sélectionner que les post dont le time est max dans cette jointure...

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

Discussions similaires

  1. [XL-2010] Sommer des résultats provenant de différents fichiers
    Par julsd24 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/08/2015, 20h41
  2. Réponses: 4
    Dernier message: 13/06/2007, 09h45
  3. [SQL2K]Une même requête des résultats différents
    Par jeeerome dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/07/2006, 14h20
  4. Réponses: 3
    Dernier message: 02/03/2006, 21h54
  5. Réponses: 3
    Dernier message: 15/02/2006, 17h28

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