#20390 - Note perso pour le SQL, inner joint, left join
https://lehollandaisvolant.net/?mode=links&id=20210919185725Bon, un truc probablement trivial en SQL, mais je dois la noter.
Pour mon lecteur RSS.
J’ai une table avec les flux, et une table avec les posts.
Dans celle avec les posts, j’ai l’id du flux. Logique.
Quand je liste les flux, je veux un compte des nombres de posts non lus qui lui sont associés :
flux1 : 10
flux2 : 5
flux3 : 0
flux4 : 0
Donc ça :
SELECT flux.id, COUNT(posts.id) AS unread FROM flux LEFT JOIN posts ON (posts.flux_id = flux.id) WHERE posts.unread=TRUE GROUP BY flux.id
Sauf que ça, ça me retourne :
flux1 : 10
flux2 : 5
Comment faire pour avoir ceux où le nombre de posts est 0 ?
Il suffit de mettre le WHERE dans le la parenthèse :
SELECT flux.id, COUNT(posts.id) AS unread FROM flux LEFT JOIN posts ON (posts.flux_id = flux.id AND posts.unread=TRUE) GROUP BY flux.id
Et là :
flux1 : 10
flux2 : 5
flux3 : 0
flux4 : 0
*faceplam*
J’ai mis beaucoup trop de temps à chercher ça
Du coup la requête complète, avec un ordre selon le titre du site dont j’ai le flux, et en incluant aussi (au passage), la date du dernier poste pour un flux donné :
SELECT flux.id, COUNT(posts.id) AS unread, MAX(posts.date) AS latestpost FROM flux LEFT JOIN posts ON (posts.flux_id = flux.id AND post.unread=TRUE) GROUP BY flux.id ORDER BY flux.titre
C’est là que je suis heureux de ne plus avoir de fichiers plain text serializé ;)
(Ces fichiers sérialisés sont très bon quand on a une liste de posts simple, mais ça devient vite la merde quand on a plusieurs tables dont les données sont mises en relation (les posts appartiennent à un flux, par exemple ; ou les commentaires à un article, les fichiers mp3 à un album, à un artiste…)