8796 sujets

Développement web côté serveur, CMS

Bonjour,

j'aimerais afficher une requete qui interroge 3 tables liés entre elles.

Ces tables sont issus de Dotclear (blog) :
dc_post, dc_categorie, dc_post_cat

La table dc_post contient les infos des billets à savoir :
post_id, post_titre, post_notes

La table dc_categorie contient les infos des catégories à savoir :
cat_id, cat_libelle

La table dc_post_cat contient les relations entre les billets et les catégories :
post_id, cat_id


j'arrive à afficher chaque billet avec son id, son titre et sa note

SELECT 
    dc_post.post_id, dc_post.post_titre, dc_post.post_notes
FROM 
    dc_post
ORDER BY 
    dc_post.post_id DESC LIMIT 0,3


j'arrive aussi à afficher le nom des catégories rattachés à l'id d'un billet

SELECT 
    dc_post_cat.post_id, dc_categorie.cat_libelle
FROM 
    dc_post_cat, dc_categorie
WHERE 
    dc_post_cat.cat_id = dc_categorie.cat_id
ORDER BY 
    dc_post_cat.post_id DESC LIMIT 0,13


Mon problème est que je n'arrive pas à ecrire une requete qui affiche chaque post avec son titre, sa note (l'image) et le nom des catégories rattachés

J'ai bien essayé avec INNER JOIN mais ça ne marche pas

SELECT
    dc_post.post_id, dc_post.post_titre, dc_post.post_notes,
    dc_categorie.cat_libelle
FROM
    dc_post
INNER JOIN dc_post_cat
    ON dc_post_cat.cat_id = dc_post.post_id
INNER JOIN dc_categorie
    ON dc_categorie.cat_id = dc_post_cat.cat_id
ORDER BY 
    dc_post.post_id DESC LIMIT 0,13


j'ai essayé aussi avec LEFT JOIN

SELECT 
    dc_categorie.cat_libelle, dc_post.post_id, dc_post.post_titre, dc_post.post_notes
FROM 
    dc_post
LEFT JOIN 
    dc_categorie ON dc_categorie.cat_id = dc_post.cat_id
ORDER BY 
    dc_post.post_id DESC LIMIT 0,3


mais la encore ca n'affiche que le nom de la premiere catégorie rattaché au billet alors qu'un billet est souvent classé dans plusieurs catégories...

Savez vous si c'est possible en 1 requete sql ?
(pour info je suis un graphiste qui a commencé a mettre les mains dans le code, soyez indulgent si je m'y prend comme un manche Smiley confused )
merci
Modifié par graffiti (07 Oct 2009 - 15:43)
Salut,

SELECT 
  p.`post_id`,
  p.`post_titre`,
  p.`post_notes`,
  GROUP_CONCAT( c.`cat_libelle` ) AS "categories"
FROM 
  `dc_post`       p   JOIN
  `dc_post_cat`   pc  USING( `post_id` ) JOIN
  `dc_categorie`  c   USING( `cat_id` )
GROUP BY
  p.`post_id`
ORDER BY
  p.`post_id` DESC
LIMIT
  0, 13
Merci agylus,

ta réponse est incorrecte #1052 - Column 'cat_id' in from clause is ambiguous



mais j'ai (enfin un dev) trouvé la solution

SELECT 
   dc_post.post_id, dc_post_cat.cat_id, dc_categorie.cat_libelle, 
   dc_post.post_notes, dc_post.post_titre
FROM  
   dc_post_cat
JOIN 
   dc_post ON dc_post_cat.post_id = dc_post.post_id
JOIN 
   dc_categorie ON dc_categorie.cat_id = dc_post_cat.cat_id
ORDER BY 
   dc_post.post_id DESC LIMIT 0 , 20