Jointures (erronées ?) avec les boucles documents et leurs critères
Soit le cas suivant :
- une document A, attaché à une rubrique R1 et R2
-
<docA>
mis dans le texte de R1 (il est donc "vu" dans R1, mais pas dans R2) - une boucle documents simplifiée (issue de squelettes-dist/inclure/documents.html) dans le squelette test.html :
<h1>Test</h1>
<BOUCLE_A(DOCUMENTS){id_article?}{id_rubrique?}{objet?}{id_objet?}{vu=non}>
<li>#FICHIER</li>
</BOUCLE_A>
Constats
Paramètre id_rubrique :
Si on appelle ?page=test&id_rubrique=1
le document A sera retourné, malgré le critère {vu=non}
.
Effectivement la boucle effectue 2 jointures différentes sur spip_documents_liens, une pour lier le champ "vu" et l'autre pour lier objet/id_objet.
Du coup, la requête SQL trouve effectivement un document A non vu (dans la rubrique 2) et le retourne (vu qu'il est lié aussi à la rubrique 1).
On obtient la requête suivante :
SELECT documents.fichier
FROM spip_documents AS `documents`
INNER JOIN spip_documents_liens AS L2 ON ( L2.id_document = documents.id_document )
INNER JOIN spip_documents_liens AS L1 ON ( L1.id_document = documents.id_document )
WHERE (documents.statut = 'publie')
AND (documents.mode IN ('image','document'))
AND (documents.taille > 0 OR documents.distant='oui')
AND (L2.id_objet = 1)
AND (L2.objet = 'rubrique')
AND (L1.vu = 'non')
GROUP BY documents.id_document
Paramètres objet / id_objet :
Si on appelle page=test&objet=rubrique&id_objet=1
, soit logiquement la même chose, on obtient 3 jointures sur spip_documents_liens.
Là, les documents retournés ne soient pas forcément ceux de l'objet demandé ! La jointure cherche des documents liés à objet=rubrique, id_objet=1, mais pas forcément dans la même liaison !
Les documents retournés ici sont parfois un peu farfelus donc là.
SELECT documents.fichier
FROM spip_documents AS `documents`
INNER JOIN spip_documents_liens AS L4 ON ( L4.id_document = documents.id_document )
INNER JOIN spip_documents_liens AS L3 ON ( L3.id_document = documents.id_document )
INNER JOIN spip_documents_liens AS L1 ON ( L1.id_document = documents.id_document )
WHERE (documents.statut = 'publie')
AND (documents.mode IN ('image','document'))
AND (documents.taille > 0 OR documents.distant='oui')
AND (L3.objet = 'rubrique')
AND (L4.id_objet = 1)
AND (L1.vu = 'non')
GROUP BY documents.id_document
Paramètre id_article
Si on appelle page=test&id_article=1
, on obtient, ô magie, une seule jointure. La boucle est correcte cette fois-ci donc. Je n'ai pas encore cherché pourquoi ça marche avec id_article, et pas id_rubrique…
SELECT documents.fichier
FROM spip_documents AS `documents`
INNER JOIN spip_documents_liens AS L1 ON ( L1.id_document = documents.id_document )
WHERE (documents.statut = 'publie')
AND (documents.mode IN ('image','document'))
AND (documents.taille > 0 OR documents.distant='oui')
AND (L1.id_objet = 1)
AND (L1.objet = 'article')
AND (L1.vu = 'non')
GROUP BY documents.id_document