Bonsoir, c'est encore moi ^^

Aujourd'hui je suis confronté à une petite colle dans le même type d'exercices que mon post précédent.

Je dois récupérer un article selon son id avec son contenu, son auteur (jusque là rien de plus enfantin me direz vous) mais aussi avec ses catégories. En effet les articles peuvent posséder plusieurs catégories. La liaison est établie dans la table suivante :

Categorie_article :

  • categorie_id
  • article_id

J'aimerais donc, en une seule requête et une seule ligne, récupérer les catégories de l'article en question. Pour le moment ma requête se présente comme suit mais ne me récupère qu'une seule catégorie (et si j'enlève le GROUP BY j'obtiens 2 lignes) :

SET lc_time_names = 'fr_CH';
SELECT @@lc_time_names;
SELECT
  a.titre as article_titre, a.contenu as article_contenu, DATE_FORMAT(a.date_publication, '%d %M %Y \à %k \heures %i') as date_formatee, a.auteur_id as auteur_id,
  ca.categorie_id,
  u.pseudo as auteur_pseudo
FROM Article a
  LEFT JOIN Categorie_Article ca 
    ON ca.article_id = a.id
  LEFT JOIN Utilisateur u 
    ON u.id = a.auteur_id
WHERE a.id = 4
GROUP BY ca.article_id

Tout en sachant que la solution n'est pas de passer par les vues :/
Merci à vous pour vos lumières :)

5 réponses


connected
Réponse acceptée

Salut,

Cela me semble impossible sans faire 2 requêtes, il faut au moins une sous requête :

SELECT 
  distinct(a.id) AS article_id, 
  a.contenu AS article_contenu, 
  DATE_FORMAT(a.date_publication, '%d %M %Y \à %k \heures %i') AS date_formatee, 
  a.auteur_id AS auteur_id,
  u.pseudo AS auteur_pseudo,
  (SELECT GROUP_CONCAT(c.libelle SEPARATOR ', ')
    FROM categories c
      LEFT JOIN categorie_article ca
      ON ca.categorie_id = c.id
    WHERE ca.article_id = a.id) AS liste_categories
FROM articles a 
LEFT JOIN categorie_article ca
  ON ca.article_id = a.id
LEFT JOIN utilisateurs u
  ON u.id = a.auteur_id
WHERE a.id = 1;

Cette requête renvoie l'article plus une nouvelle colonnes liste_categories, qui est égal à la concatenation, par des virgules, des categories liées à l'article courant

Fait 2 requêtes :)

Justement le but c'est de le faire en une seule requêtes, c'est une petite formation que je fais dans le but d'apprendre certaines fonctions et méthodes du langage sql que je n'ai pas l'habitude d'utiliser. C'est vrai qu'ici l'exemple est bête et en toute logique 2 requêtes seraient beaucoup plus simple. Mais le but c'est de le faire en une seule requête, et j'avoue que je ne trouve pas cohérent de procéder de cette façon :/

Sinon Je te remercie connected c'est exactement ça =D

C'est surtout un pb de performances, sinon tu pars de categorie et tu left join sur article

Aussi oui, après réflexion un INNER JOIN aurait aussi fait l'affaire avec un GROUP_CONCAT dans la sélection des catégories :)