select et requêtes récursives

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : select et requêtes récursives

par lowcraft » 23 mai 2006, 09:44

C'est l'exemple parfait d'une requête élégante et lisible, mais malheureusement, je ne peux l'exploiter, car le serveur ou je dois réaliser le déploiement n'est pas encore à une version capable d'utiliser les UNION !!! bah, en tout ca, cela mérite d'être clair et commenter.

Maintenant, à savoir si il existe une solution plus 'clair' avec une version antérieur, à savoir 3.23.*, je laisse soit aux experts en la matière de nourrir, s'ils le souhaitent, ce post.

Bon post/sql (mauvais exemple).
Olivier. :pouce:

par sadeq » 23 mai 2006, 09:07

J'avoue que j'ai donné ma requête à la hate, voici le corrigé :

Code : Tout sélectionner

SELECT (SELECT texte FROM texte WHERE lang = "fr" AND id = r.nom ) AS texte_nom, (SELECT texte FROM texte WHERE lang = "fr" AND id = r.description ) AS texte_description FROM rubriques AS r
où :
SELECT texte FROM texte WHERE lang = ? AND id = ?
retourne le texte d'un id donné dans la langue donnée, cette requête
est utilisé dans la requête de base pour traduire les colonnes nom et description selon le langage.

La requête de base voulant tariter toutes les rubriques elle fait donc :
SELECT ? FROM rubriques as r

le ? dans cette requête correspond à la liste des colonnes et donc à une suite des sous-requêtes de traduction.
La relation entre une sous-requête et la requête de base est le nom de la colonne à traduire (r.nom et r.description)

L'imbrication des requêtes n'est posssible que sur une version > à 4.1

par lowcraft » 22 mai 2006, 13:27

Merci.
Bon, le code envoyé retourne une erreur de syntaxe, mais après moultes experiences, j'ai enfin réussi à avoir ce que je voulais, j'explique plus en avant ce que je souhaitait, les tables, leurs définitions, ainsi que la méthode utilisé pour y parvenir, histoire que cela puisse aider d'autres personnes dans le même cas.

Pour commencer, j'ai une table que j'ai nommée texte, elle contient tous les textes des autres tables, avec le support multilangue (colonne lang), schéma des colonnes:
id, lang, texte
Puis une table rubriques:
id, code, nom, description
nom et description faisant référence à texte.id.

Si l'on fait une requête de type :

Code : Tout sélectionner

SELECT * FROM RUBRIQUES
on se retrouve avec le resultat brut, maintenant, grace à cette requête, je récupère la valeur de texte en correspondance avec rubriques.nom et rubriques.description:

Code : Tout sélectionner

SELECT R.*, T.TEXTE AS NOM_TEXTE, T2.TEXTE AS DESCRIPTION_TEXTE FROM RUBRIQUES R, TEXTE T, TEXTE T2 WHERE R.NOM = T.ID AND T.LANG = "fr" AND R.DESCRIPTION = T2.ID AND T2.LANG = "fr" ;
Cette requête me retourne toutes les lignes avec la correspondance texte en francais.
Notez que si l'on rajoute une autre colonne dans la table rubriques faisant appel à texte, nous devons donc créer autant "d'alias" que nécessaire; T2.TEXTE, T3.TEXTE, T4.TEXTE etc...

Si des erreurs sont quand même parvenues à se faufiler dans cette explication, merci d'y contribuer, et si vous trouvez d'autres requêtes plus "élégantes" que celle ci, je suis preneur.

Encore une dernière chose, mon serveur de production est php5, mysql5, par contre, les serveurs dit clients ne supportes en générale qu'au plus la version 4, mais la plupart ont la 3.23.*, de ce faite, les UNION et autres fonctions ne sont pas possibles.

A vos bonnes contributions, salut.
Olivier

par sadeq » 18 mai 2006, 13:27

En requêtes imbriquées ça peut donner ça:

Code : Tout sélectionner

SELECT (select texte from texte where t1.nom = id and lang = "fr") as texte_nom, (select texte from texte where t1.description = id and lang = "fr") as texte_description FROM produits as t1;

select et requêtes récursives

par lowcraft » 18 mai 2006, 12:44

Bonjour à tous,

Afin d'optimiser mes requêtes (donc de les limiter, tout au plus), j'aimerais executer qu'une seule requête qui récupère d'un coup tous les éléments d'une table, ainsi que des résultats correspondant à deux champs de la première table, je m'explique:

J'ai deux tables: produits et textes
produits contient la liste des produits avec un champ nom et un champ description, tout deux ne font références qu'à la table textes qui contient les textes (pour le support multilangue), ma requete doit pouvoir extraire donc une ou plusieurs lignes de la table produits en retournant par la même, nom pas l'id de nom et de description, mais en faite leur équivalent enregistrer dans la table textes, et en y ajoutant la clause permettant d'avoir le résultat dans la langue voulue.

Ma requête fonctionne comme ceci :

Code : Tout sélectionner

select t1.*, t2.texte from produits as t1, texte as t2 where t1.nom = t2.id and t2.lang = "fr";
Mais je souhaite aussi qu'il récupère le champ t2.texte, correspondant à t1.description, malheureusement, sous cette forme de requête, cela ne fonctionne pas, je bloque un peut.

Merci pour votre aide.
Olivier.