* cedric@yterium.com tapuscrivait, le 30/01/2008 22:56:
Author: cedric@yterium.com
Date: 2008-01-30 22:56:01 +0100 (mer, 30 jan 2008)
New Revision: 11162Log:
differencier le {!xxx IN truc} du {xxx !IN truc}
le premier indique une exclusion d'un sous ensemble, le second une inclusion d'un autre sous ensemble
(idem avec == )
on a donc crit->exclus et crit->not dans le compilateur
A noter que {!xxx IN truc} produit une ecriture assez peu optimisee puisque le FIELD(L2.id_groupe,1) AS cpt1 reste dans le select de la premiere requete
et le "group by cpt1" aussi. a creuser
Cela doit neanmoins produire le resultat escompte dans tous les cas maintenant
Ben non ![]()
Avec ce squelette :
BOUCLE_Secteurs2(RUBRIQUES){racine}{par num titre}{!titre_mot IN MenuHaut,PasDansMenu}>
ça compile :
SELECT 0+rubriques.titre AS num, rubriques.id_rubrique, FIELD(L2.titre,'MenuHaut','PasDansMenu') AS cpt1, rubriques.titre, rubriques.id_rubrique, rubriques.lang
FROM spip_rubriques AS `rubriques`
INNER JOIN spip_mots_rubriques AS L1 ON (L1.id_rubrique = rubriques.id_rubrique)
INNER JOIN spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
WHERE (rubriques.statut = 'publie')
AND (rubriques.id_parent = 0)
AND NOT((rubriques.id_rubrique IN (
SELECT rubriques.id_rubrique
FROM `db_spip`.spip_rubriques AS `rubriques`
INNER JOIN `db_spip`.spip_mots_rubriques AS L1 ON (L1.id_rubrique = rubriques.id_rubrique)
INNER JOIN `db_spip`.spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
WHERE (FIELD(L2.titre,'MenuHaut','PasDansMenu') <> 0))))
GROUP BY rubriques.id_rubrique
ORDER BY num
qui ne renvoit rien.
En transformant la requête en :
SELECT 0+rubriques.titre AS num, rubriques.id_rubrique, FIELD(L2.titre,'MenuHaut','PasDansMenu') AS cpt1, rubriques.titre, rubriques.id_rubrique, rubriques.lang
FROM spip_rubriques AS `rubriques`
INNER JOIN spip_mots_rubriques AS L1 ON (L1.id_rubrique = rubriques.id_rubrique)
INNER JOIN spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
WHERE (rubriques.statut = 'publie')
AND (rubriques.id_parent = 0)
AND NOT((rubriques.id_rubrique IN (
SELECT rubriques.id_rubrique
FROM `db_spip`.spip_rubriques AS `rubriques`
INNER JOIN `db_spip`.spip_mots_rubriques AS L1 ON (L1.id_rubrique = rubriques.id_rubrique)
INNER JOIN `db_spip`.spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
WHERE (FIELD(L2.titre,'MenuHaut','PasDansMenu') <> 0))))
GROUP BY rubriques.id_rubrique
ORDER BY num
ça renvoit la bonne liste, mais non triée par 'num'.
En enlevant en plus le GROUP BY rubriques.id_rubrique c'est trié par 'num'.
Et la requête peut encore être simplifiée en :
SELECT 0+rubriques.titre AS num, rubriques.id_rubrique, rubriques.titre, rubriques.id_rubrique, rubriques.lang
FROM spip_rubriques AS `rubriques`
WHERE (rubriques.statut = 'publie')
AND (rubriques.id_parent = 0)
AND NOT((rubriques.id_rubrique IN (
SELECT L1.id_rubrique
FROM `db_spip`.spip_mots_rubriques AS L1
INNER JOIN `db_spip`.spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
WHERE (FIELD(L2.titre,'MenuHaut','PasDansMenu') <> 0))))
ORDER BY num