Les unions entre taules

Exemples de bucles que produeixen una combinació múltiple entre 3 taules

  • Apparu en : SPIP 2.0

Volem, en un bucle, recuperar les informacions d’articles d’una (o diverses) secció a la que se li assigna una paraula clau (que nosaltres coneixem).

<BOUCLE_a(ARTICLES spip_mots_rubriques spip_mots) {titre_mot=truc}>

crearà la petició sql següent:

  SELECT articles.id_rubrique,
         articles.id_article,
         ...
         articles.lang
    FROM spip_articles AS <span class="base64" title="PGNvZGUgY2xhc3M9J3NwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lJyBkaXI9J2x0cic+YXJ0aWNsZXM8L2NvZGU+"></span>
         INNER JOIN spip_mots_rubriques AS L1
                 ON L1.id_rubrique = articles.id_rubrique
         INNER JOIN spip_mots AS L2
                 ON L2.id_mot = L1.id_mot
   WHERE articles.statut = 'publie'
     AND L2.titre = 'truc'
GROUP BY articles.id_article

Volem en un bucle seleccionar aleatòriament un document a dins d’un sector. électionner aléatoirement un document dans un secteur. És a dir que aquest sector no conté articles, només seccions amb documents vinculats (fototeca).

<BOUCLE_d(spip_documents_liens rubriques)
          {objet = rubrique}
          {rubriques.id_secteur = 13}
          {par hasard}
          {0, 1}>
  #LOGO_DOCUMENT
</BOUCLE_d>

-  la taula spip_documents_liens és una taula que fa inventari els enllaços (unions) entre un document i un objet (article, secció, paraula, lloc...).

Entrades tipus d’aquesta taula podrien semblar-se a:

id_document id_objet objet vu
14 36 article non
363 66 rubrique non
... ... ... ...

Per tant, anirem a buscar a dins d’aquesta taula els documents relacionats a una secció {objet = rubrique}

Però volem, també, que aquesta secció sigui descendent de la secció sector d’id 13

Hem d’establir, per tant, a dins de la nostra petició una unió entre la taula spip_documents_liens i spip_rubriques

Aquesta unió es farà per una banda:
l’id_objet de spip_documents_liens, de l’altra
l’id_rubrique de spip_rubriques

Per això indicarem a SPIP que volem aquesta unió específica donant les 2 taules al bucle <BOUCLE_d(spip_documents_liens rubriques)...

Finalment, per especificar la nostra restricció respecte al sector 13, precisarem el criteri {rubriques.id_secteur = 13} especificant explícitament el nom complet del camp (nom de la taula inclòs) per tal que la petició no vagi a buscar un camp spip_documents_liens.id_secteur que no existeixi.

-  a partir d’aquest bucle, per tant, tindrem llavors accés a tots els camps de spip_documents_liens i a tots els de spip_rubriques :

#ID_DOCUMENT
#ID_OBJET
#OBJET
#VU

#ID_RUBRIQUE
#ID_PARENT
#TITRE
#DESCRIPTIF
#TEXTE
#ID_SECTEUR
...

-  la petició sql creada pel nostre bucle:

  SELECT rand() AS alea,
         spip_documents_liens.id_document
    FROM spip_documents_liens AS `spip_documents_liens`
         INNER JOIN spip_rubriques AS L1
                 ON L1.id_rubrique = spip_documents_liens.id_objet
                AND spip_documents_liens.objet = 'rubrique'
   WHERE spip_documents_liens.objet = 'rubrique'
     AND L1.id_secteur = 13
GROUP BY spip_documents_liens.id_document,
         spip_documents_liens.id_objet,
         spip_documents_liens.objet
ORDER BY alea
   LIMIT 0,1

-  finalment, l’etiqueta #LOGO_DOCUMENT ens retornarà el codi font html:

<img src='local/cache-vignettes/L135xH150/Image_10-d84e2.png'
width='135' height='150' style='height:150px;width:135px;' alt=''
class='spip_logos' />

I si volem el nom del fitxer document, que no podem tenir directament amb aquesta petició ja que el camp spip_documents.fichier no es recollit (no hi ha unió amb la taula spip_documents), llavors haurem de declarar una unió suplementària a la taula spip_documents:

<BOUCLE_d(spip_documents_liens documents rubriques)
          {objet = rubrique}
          {rubriques.id_secteur = 13}
          {par hasard}
          {0, 1}>
#LOGO_DOCUMENT / #FICHIER
</BOUCLE_d>

Petició creada:

  SELECT rand() AS alea,
         spip_documents_liens.id_document,
         L2.fichier
    FROM spip_documents_liens AS <span class="base64" title="PGNvZGUgY2xhc3M9J3NwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lJyBkaXI9J2x0cic+c3BpcF9kb2N1bWVudHNfbGllbnM8L2NvZGU+"></span>
         INNER JOIN spip_documents AS L2
                 ON L2.id_document = spip_documents_liens.id_document
         INNER JOIN spip_rubriques AS L1
                 ON L1.id_rubrique = spip_documents_liens.id_objet
                AND spip_documents_liens.objet='rubrique'
   WHERE spip_documents_liens.objet = 'rubrique'
     AND L1.id_secteur = 13
GROUP BY spip_documents_liens.id_document,
         spip_documents_liens.id_objet,
         spip_documents_liens.objet
ORDER BY alea
   LIMIT 0,1

Alerta núm. 1:
-  aquí, tenim gairebé accés a tots els camps de les 3 taules
«gairebé» però alerta als camps homònims:
els #TITRE, #DESCRIPTIF, #MAJ, #STATUT i #DATE mostrats, que són camps homònims a spip_documents i spip_rubriques, seran els de spip_documents (taula primera de la petició)!

Alerta núm. 2:
-  les escriptures de nom de taula

si :

  <BOUCLE_d(DOCUMENTS_LIENS
  <BOUCLE_d(documents_liens
   <BOUCLE_d(SPIP_DOCUMENTS_LIENS
   <BOUCLE_d(spip_documents_liens 

són équivalentes ;

com:

  <BOUCLE_d(documents_liens documents rubriques
  <BOUCLE_d(documents_liens documents spip_rubriques
  <BOUCLE_d(documents_liens documents RUBRIQUES

són equivalent;

i fins i tot:

  <BOUCLE_d(documents_liens documents
  <BOUCLE_d(documents_liens spip_documents
  <BOUCLE_d(spip_documents_liens spip_documents
  <BOUCLE_d(spip_documents_liens documents 

també són equivalent;

no és el mateix amb:

  <BOUCLE_d(DOCUMENTS_LIENS DOCUMENTS
  <BOUCLE_d(documents_liens DOCUMENTS
  <BOUCLE_d(SPIP_DOCUMENTS_LIENS DOCUMENTS
  <BOUCLE_d(spip_documents_liens DOCUMENTS

on la manera com s’esciu documents ocasiona una pèrdua d’unió entre spip_documents_liens i spip_documents.

Autor merce Publié le : Mis à jour : 28/04/23

Traductions : català, English, français, Nederlands, українська