juste pour que ca ne passe pas inapercu :
Je ne reproduis pas le bug. Sur une de mes bases ça me donne:
SELECT documents.id_document, documents.titre
FROM spipnet_documents AS `documents` INNER JOIN spipnet_documents_liens AS L1 ON ( L1.id_document = documents.id_document )
WHERE (documents.mode != 'vignette')
AND (documents.taille > 0 OR documents.distant='oui')
AND (L1.id_objet = 3636)
AND (L1.objet = 'article')
GROUP BY documents.id_document
et me retourne le doc associé.
Committo,Ergo:Sum
Hello ESJ …
ok j’avais réduit le problème bêtement …
ca marche en effet avec la micro boucle …
la ou ca casse c’est dans des boucles “teste tout” utilisée dans des plugins et qui ne bloquaient pas récemment… (sans changer la configuration du site)
Par exemple prenons cette page simple de test ( :
BOUCLE avec points d’interrogation et plusieurs critères facultatifs:
<BOUCLE_docs(DOCUMENTS){id_article ?}{id_rubrique ?}{id_document ?}{id_mot ?}>
#ID_DOCUMENT
</BOUCLE_docs>
BOUCLE sans avec juste {id_article ?} id_article=#ENV{id_article}
documents =
<BOUCLE_docs1(DOCUMENTS){id_article ?}>
#ID_DOCUMENT
</BOUCLE_docs1>
Pour la première boucle, rien ne sors
La seconde est ok
Là je ne comprends pas trop
kent1
Au fait la page est là :
http://kent1.sklunk.net/spip.php?page=test&id_article=99
kent1
2008/7/10 Quentin Drouet <kent1@arscenic.info>:
Oui en effet l'unification des tables de doc_lien a fichu en l'air la prise en compte des critères conditionnels, puisq'on a ça:
SELECT documents.id_document
FROM spipnet_documents AS `documents` INNER JOIN spipnet_documents_liens AS L2 ON ( L2.id_document = documents.id_document ) INNER JOIN spipnet_documents_liens AS L1 ON ( L1.id_document = documents.id_document )
WHERE (documents.mode != 'vignette')
AND (documents.taille > 0 OR documents.distant='oui')
AND (L1.id_objet = 3636)
AND (L1.objet = 'article')
AND (L2.objet = 'rubrique')
GROUP BY documents.id_document
Faut réfléchir pour ça donne une triple jointure, c'est pas clair à cette heure.
Committo,Ergo:Sum
ok,je vois le probleme
la condition supplémentaire (LN.objet='yyyy') est ajouté sans condition, ce qui fait que la jointure n'est pas supprimee en cas d'absence d'id_yyy.
Je vais regarder
Cédric
oui, c'est bon
concernant la syntaxe
INNER JOIN L on (t.id_xx=L.id_objet AND L.objet='xxx')
je n'ai pas pris le temps de verifier sa compatibilité avec toutes les versons de mysql et autres
Par ailleurs je crois que son implémentation nécessitera de casser encore un peu le compilo.
Du coup, j'ai préféré m'en tenir à une valeur sure en completant la condition dans le ON par un WHERE.
Cela laisse une marge d'optimisation pour la prochaine version
Cédric