Je veux d'une seule requête sélectionner mes articles et leur url canonique :
select a.titre, u.url from spip_articles a left join spip_urls u
on u.type='article' and u.id_objet=a.id_article where (CONDITION
SUR MES ARTICLES) group by u.id_objet;
=> mais comment indiquer qu'il me faut l'url la plus récente du lot ?
avec la requête ci-dessus, ça m'en donne une arbitraire (en pratique,
la plus vieille)
select a.titre, u.url from spip_articles a left join spip_urls u
on u.type='article' and u.id_objet=a.id_article where (CONDITION
SUR MES ARTICLES) group by u.id_objet;
=> mais comment indiquer qu'il me faut l'url la plus récente du lot ?
J'y parviens avec une sous-requête, mais ça me paraît être une voie détournée :
select * from (select a.titre, u.* from spip_articles a left join
spip_urls u on u.type='article' and u.id_objet=a.id_article where
id_article=310 order by u.date desc) as b group by b.id_objet;
Je veux d'une seule requête sélectionner mes articles et leur url canonique :
select a.titre, u.url from spip_articles a left join spip_urls u
on u.type='article' and u.id_objet=a.id_article where (CONDITION
SUR MES ARTICLES) group by u.id_objet;
=> mais comment indiquer qu'il me faut l'url la plus récente du lot ?
Ceci marche (testé) :
SELECT a.titre, u.url FROM spip_articles a LEFT JOIN spip_urls u
ON u.id_objet=a.id_article WHERE u.TYPE='article' GROUP BY u.id_objet ORDER BY u.id_objet DESC;
À noter : le group by et le order portent sur le même champ !!!
Quant à la jointure, bien que ta syntaxe marche, je n'aurais jamais imaginé la faire.
Du coup, j'ai reporté une partie de ta jointure dans le Where
Il manque ton (CONDITION SUR MES ARTICLES) à rajouter
Ça ne réponds pas au besoin : la requête ne te ramène pas l'url la plus récente (selon le champ DATE)
Il se peut que ça renvoie la bonne chose dans certains cas, dont le tiens, mais c'est pur coup de bol.
Ceci marche (testé) :
SELECT a.titre, u.url FROM spip_articles a LEFT JOIN spip_urls u
ON u.id_objet=a.id_article WHERE u.TYPE='article' GROUP BY u.id_objet
ORDER BY u.id_objet DESC;
non c'est purement arbitraire ; et chez moi ça ne marche pas
Pas essayé, mais as-tu tenté quelque chose de cette forme ?
SELECT a.titre, u.url, MAX(u.date) AS m
FROM spip_articles a
LEFT JOIN spip_urls u
ON u.type=‘article’ and u.id_objet=a.id_article
WHERE u.date=m
AND (CONDITION SUR MES ARTICLES)
GROUP BY a.id_article;
Pas essayé, mais as-tu tenté quelque chose de cette forme ?
SELECT a.titre, u.url, MAX(u.date) AS m
FROM spip_articles a
LEFT JOIN spip_urls u
ON u.type='article' and u.id_objet=a.id_article
WHERE u.date=m
AND (CONDITION SUR MES ARTICLES)
GROUP BY a.id_article;
ben c'est pas logique, le where étant calculé avant le group by ; du
coup sanction :
===> Unknown column 'm' in 'where clause'