[résolu] jointure et 'distinct'

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par seebz, 6 Janvier 2009.

  1. seebz
    seebz WRInaute impliqué
    Inscrit:
    15 Avril 2007
    Messages:
    722
    J'aime reçus:
    0
    Bonjour à tous,
    J'ai un petit problème avec une requête qui doit me retourner les fiches qui ont été commentées en dernier.
    La requete fonctionne bien sauf que si une fiche a reçu plusieurs commentaires récemment, elle resortira plusieurs fois dans ma liste, ce que je ne souhaite pas.

    Code:
    SELECT Fiche.*, Comment.created_at AS last_comment_created_at 
    FROM dkannu_fiches Fiche 
    JOIN dkannu_comments Comment ON Fiche.id=Comment.fiche_id AND Comment.online=1 
    WHERE Fiche.online='1' 
    ORDER BY Comment.created_at DESC 
    LIMIT 20
    J'ai essayé d'utiliser DISTINCT et GROUP BY mais les résultats ne sont pas ceux attendus, une bonne âme pourra-t-elle m'aider ?

    J'avoue que je suis à cours d'idée là :?
     
  2. lupuz
    lupuz WRInaute discret
    Inscrit:
    15 Mars 2006
    Messages:
    192
    J'aime reçus:
    0
    Tu devrais pouvoir faire une sous requete
    -http://dev.mysql.com/doc/refman/5.1/en/subqueries.html
     
  3. Bool
    Bool WRInaute passionné
    Inscrit:
    26 Février 2004
    Messages:
    1 543
    J'aime reçus:
    0
    Dans le cas présent je verrais plutôt un "group by". Tout ce qui t'intéresse dans "kannu_comments" c'est la date de création la plus récente.
     
  4. seebz
    seebz WRInaute impliqué
    Inscrit:
    15 Avril 2007
    Messages:
    722
    J'aime reçus:
    0
    Merci à tous les 2 d'avoir répondus :D

    Pouvez-vous (si possible) me donner un exemple de requete car je ne vois pas comment faire avec la sous-requete.
    J'ai aussi essayé le GROUP BY mais ca ne prenait pas forcément le dernier commentaire d'une fiche (j'ai probablement du mal m'y prendre)
     
  5. YoyoS
    YoyoS WRInaute accro
    Inscrit:
    14 Septembre 2006
    Messages:
    3 225
    J'aime reçus:
    0
    Salut, voila 2 requêtes. Je me suis construit une tite table fiche et commentaire et voila ce qui en ressort:

    Code:
    select fiche.id as idfiche, comment.date, comment.id as idcomm
    from comment inner join fiche on (comment.id_fiche = fiche.id)
    group by comment.id_fiche
    order by comment.date DESC
    ou encore, une plus farfelue moins consommatrice de mémoire mais surement plus lente:

    Code:
    select id as idcomm,date,(select id from fiche where id = (select id_fiche from comment where id = idcomm)) as idfiche
    from comment
    group by id_fiche
    order by date DESC
     
  6. seebz
    seebz WRInaute impliqué
    Inscrit:
    15 Avril 2007
    Messages:
    722
    J'aime reçus:
    0
    Génial, je vais tester ça demain à la première heure, certainement la première requete car comme je suis en mutualisé je me tamponne de la consommation mémoire (joke ;))

    Si ca marche, je te remercierai 1000 fois (et bool/lupuz aussi bien entendu) , sinon je me mettrai à la broderie :p
     
  7. Bool
    Bool WRInaute passionné
    Inscrit:
    26 Février 2004
    Messages:
    1 543
    J'aime reçus:
    0
    sans un max() pour récupérer la date la plus récente, tu vas surtout avoir des résultats aléatoires ;)
     
  8. seebz
    seebz WRInaute impliqué
    Inscrit:
    15 Avril 2007
    Messages:
    722
    J'aime reçus:
    0
    Arf, des résultats aléatoire, j'en ai eu pas mal en testant diverses requetes :?

    Que recommandes-tu ? ou placerais-tu le MAX() ?

    Encore merci de m'aider :D
     
  9. coolspot
    coolspot WRInaute discret
    Inscrit:
    10 Décembre 2007
    Messages:
    78
    J'aime reçus:
    0
    Re: [sql] jointure et 'distinct'

    déjà je pense que la requete à un problème dans la jointure et que le Comment.online=1 doit se trouver apres la première close where :

    Code:
    SELECT Fiche.*, Comment.created_at AS last_comment_created_at 
    FROM dkannu_fiches Fiche 
    JOIN dkannu_comments Comment ON Fiche.id=Comment.fiche_id
    WHERE Fiche.online='1'  AND Comment.online='1' 
    ORDER BY Comment.created_at DESC 
    LIMIT 20
    Ensuite je mettrai un group by Fiche.id (ou ref ou num je sais pas quel est l'identifiant de tes fiche) pour éviter les doublons donc un truc final comme ça :

    Code:
    SELECT Fiche.*, Comment.created_at AS last_comment_created_at 
    FROM dkannu_fiches Fiche 
    JOIN dkannu_comments Comment ON Fiche.id=Comment.fiche_id
    WHERE Fiche.online='1'  AND Comment.online='1'
    GROUP BY Fiche.id 
    ORDER BY Comment.created_at DESC
    LIMIT 20
     
  10. Bool
    Bool WRInaute passionné
    Inscrit:
    26 Février 2004
    Messages:
    1 543
    J'aime reçus:
    0
    De manière générale si vous avez un GROUP BY sans le moindre appel à une fonction d'agrégation (min(), max(), avg(), count(), etc), c'est qu'il y a un pépin dans votre requête...
     
  11. YoyoS
    YoyoS WRInaute accro
    Inscrit:
    14 Septembre 2006
    Messages:
    3 225
    J'aime reçus:
    0
    Youps, merci bool, heureusement que tu suis :D J'ai été légèrement vite, voila la requête corrigé avec le MAX(date) et pas date :D

    Code:
    SELECT fiche.id as idfiche,max(date) as last,comment.id as idcom
    FROM comment INNER JOIN fiche ON (fiche.id = comment.id_fiche)
    GROUP by id_fiche
    ORDER BY last DESC
    Et les résultats du test, beaucoup plus pertinents :p


    Table commentaire
    Code:
       
    Textes complets  	id 	date 	id_fiche
    	Modifier 	Effacer 	1 	2009-01-06 23:59:39 	1
    	Modifier 	Effacer 	2 	2009-01-06 23:48:02 	3
    	Modifier 	Effacer 	3 	2009-01-06 23:48:07 	4
    	Modifier 	Effacer 	4 	2009-01-06 23:42:21 	2
    	Modifier 	Effacer 	5 	2009-01-06 23:53:21 	3
    	Modifier 	Effacer 	6 	2009-01-06 23:48:30 	1
    	Modifier 	Effacer 	7 	2009-01-06 23:48:12 	2
    
    Table Fiche

    Code:
    Textes complets  	id
    	Modifier 	Effacer 	1
    	Modifier 	Effacer 	2
    	Modifier 	Effacer 	3
    	Modifier 	Effacer 	4
    
    Résultat de la requête:

    Code:
    idfiche 	last Décroissant 	idcom
    1 	2009-01-06 23:59:39 	1
    3 	2009-01-06 23:53:21 	2
    2 	2009-01-06 23:48:12 	4
    4 	2009-01-06 23:48:07 	3
    
     
  12. seebz
    seebz WRInaute impliqué
    Inscrit:
    15 Avril 2007
    Messages:
    722
    J'aime reçus:
    0
    Je vois que certains ont bossés tard sur mon problème et je les remercie ;)

    Je viens de tester et le gagnant est [..roulement de tambours..] YoyoS (avec les remarques de Bool et coolspot).
    La requete finale est la suivante :
    Code:
    SELECT Fiche.*, MAX(Comment.created_at) AS last_comment_created_at 
    FROM dkannu_fiches Fiche 
    INNER JOIN dkannu_comments Comment 
    	ON Fiche.id=Comment.fiche_id 
    WHERE Fiche.online='1' AND Comment.online='1' 
    GROUP BY Comment.fiche_id 
    ORDER BY last_comment_created_at DESC 
    LIMIT 20
    Je suis content que ca fonctionne, ca m'évitera d'apprendre la broderie :p
    Comme promis :
    Code:
    $thanks_to = array('YoyoS', 'Bool', 'coolspot', 'lupuz');
    for($i=0; $i<1000; $i++) 
    	printf('Merci à %s et longue vie à WRI !<br />', join(', ', $thanks_to));
     
  13. YoyoS
    YoyoS WRInaute accro
    Inscrit:
    14 Septembre 2006
    Messages:
    3 225
    J'aime reçus:
    0
    T'aurais pu nous faire une page php dédiée qu'on puisse executer avec la boucle des remerciements quand même :D
     
  14. seebz
    seebz WRInaute impliqué
    Inscrit:
    15 Avril 2007
    Messages:
    722
    J'aime reçus:
    0
    Suffit de demander, et ici un 'tit truc rien que pour toi :lol: (faut bien décompresser)
     
  15. YoyoS
    YoyoS WRInaute accro
    Inscrit:
    14 Septembre 2006
    Messages:
    3 225
    J'aime reçus:
    0
    Snirf, ca y est, j'ui zému :D
     
Chargement...
Similar Threads - [résolu] jointure distinct Forum Date
Problème images en https (forum phpbb) [résolu] Développement d'un site Web ou d'une appli mobile 18 Novembre 2017
[Résolu] Redirection 301 FR vers EN sur Prestashop uniquement sur outils Google ? Problèmes de référencement spécifiques à vos sites 11 Septembre 2017
[résolu] Passage à HTTPS, comment tester une page ? Développement d'un site Web ou d'une appli mobile 7 Septembre 2017
[Résolu] Redirection d'une famille d'URL URL Rewriting et .htaccess 9 Mars 2017
[Résolu] Diaporama et SEO Débuter en référencement 17 Janvier 2017
[résolu]Redirection monsite.fr/index.html sur monsite.fr et seo URL Rewriting et .htaccess 16 Janvier 2017
[resolu]Publicité facebook lié au compte instagram Facebook 12 Décembre 2016
[résolu] Récupérer des valeurs issues de javascript pour les mettre en base MySQL Développement d'un site Web ou d'une appli mobile 18 Juillet 2016
[résolu] Faire une redirection sauf pour mon adresse IP URL Rewriting et .htaccess 15 Juin 2016
[Résolu] 2 descriptions pour une même url selon requête Crawl et indexation Google, sitemaps 1 Juin 2016
[résolu] Action onchange sur FORM/SELECT qui ne fonctionne qu'à la première action ?!? Développement d'un site Web ou d'une appli mobile 31 Mai 2016
[résolu] Sessions : lire le contenu alors qu'on ne sait pas comment il est nommé... Développement d'un site Web ou d'une appli mobile 25 Mai 2016
[résolu] Avoir un paramètre de session "dynamique" ? Développement d'un site Web ou d'une appli mobile 25 Mai 2016
[résolu] Hauteur de div selon état d'un bouton radio Développement d'un site Web ou d'une appli mobile 23 Mai 2016
[résolu] recupération de flux xml et erreur encodage des caractères Développement d'un site Web ou d'une appli mobile 27 Janvier 2016
[résolu] Carte Google Maps avec "zones de densité" Développement d'un site Web ou d'une appli mobile 5 Novembre 2015
Balise NoIndex ignorée par Google? [résolu] Débuter en référencement 13 Janvier 2015
[Résolu] sites référents sans lien vers mon site Demandes d'avis et de conseils sur vos sites 7 Janvier 2015
Lorsqu'on a créé un site, faut-il mettre un lien vers son site dans le footer ? [Résolu] Débuter en référencement 31 Décembre 2014
[RESOLU] recuperer valeur d'un champ en js Développement d'un site Web ou d'une appli mobile 17 Décembre 2014