[spip-dev] un problème de conception avec spip_urls

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)

-- Fil

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;

-- Fil

Ciao

Avec un LAST(champ date) dans ton select ça ne ferait pas l'affaire ?

Km

* Fil tapuscrivait, le 23/01/2011 11:29:

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

-- RealET

Ç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.

Cédric

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

-- Fil

Avec un LAST(champ date) dans ton select ça ne ferait pas l'affaire ?

pas mieux ; si j'utilisais Access ça marcherait peut-être, mais LAST()
n'a pas l'air défini en MySQL.

-- Fil

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;

2011/1/23 Fil <fil@rezo.net>

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'

-- Fil

Rah, zut, désolé…

2011/1/24 Fil <fil@rezo.net>