Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/11/2011, 18h21   #1
Invité de passage
 
Inscription : avril 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 13
Points : 3
Points : 3
Par défaut Requête Multi Langue

Bonjour je fais un système de gestion multi langue

Exemple table category contient un id
il y a une table language qui contient id, code(pour fr, en, es etc)
et une autre table intersection language_category qui contient id_language, id_category, name

je fais mon affichage avec cette requête

Code :
1
2
3
4
5
SELECT category.id_category, language_category.name FROM category 
INNER JOIN language_category USING(id_category) 
INNER JOIN LANGUAGE USING(id_language) 
WHERE LANGUAGE.code='fr' 
ORDER BY language_category.name ASC
Le problème est que j'aimerais s'il n'a pas la langue Français, afficher en Anglais et si pas en Anglais afficher Espagnol par exemple un sorte priorité en fonction de la langue de utilisateur

Je ne sais pas si vous avez déjà fait quelques chose de ce genre

Merci
davland7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2011, 21h27   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 656
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 656
Points : 2 658
Points : 2 658
Bonjour,


comment avez-vous modélisé cette histoire de priorité ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2011, 23h26   #3
Invité de passage
 
Inscription : avril 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 13
Points : 3
Points : 3
Merci, je ne suis pas un expert en base de données j'apprends sur le tas je ne sais pas si j'ai fais ça comme il faut.

dans la table category il y a un id

exemple id_category

id_category(KEY)
1
2

dans la table language il y a id_language, code

id_language(KEY) code
1 fr
2 en

et dans la table language_category il y a id_language, id_category, name

exemple

id_language(KEY) id_category(KEY) name
1 1 Poulet
2 1 Chicken
2 2 Fish


si mon utilisateur est un français va voir dans la table category, voit qui il y a id 1 et 2, mais 2 voit qui y a pas de libellé en Français parce que le lui envoi fr, mais un en Anglais alors il affiche

Poulet
Fish

C'est sure quand 2e je veux aller voir le libelle en anglais

je ne sais pas si il faut faire une boucle ou autre je pourrai m’en sortir avec PHP mais je crois que le faire dans en SQL irai plus vite.

Merci
davland7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 09h12   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 656
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 656
Points : 2 658
Points : 2 658
Comment gérez-vous les libellés ? vous les chargés en mémoire au démarrage de l'appli ? où vous faites des requêtes sur votre table au fure et à mesure ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 12h34   #5
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 546
Points : 7 546
Je suppose qu'il existe une table qui identifie pour chaque utilisateur les langues qu'il utilise avec leur niveau de priorité.
Cette table aurait la structure suivante :
user_language_priority (id_user, id_language, priority)
A partir de là, la requête est assez simple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
WITH    libelle
    AS  (   SELECT  cat.id_category
                ,   lct.name
                ,   lgp.priority 
            FROM    category            AS cat 
                INNER JOIN 
                    language_category   AS lct
                    ON  cat.id_category = lct.id_category
                INNER JOIN
                    user_language_priority   AS lgp
                    ON  lct.id_language = lgp.id_language
            WHERE   lgp.id_user = 'XXX'
        )  
SELECT  lbl.id_category
    ,   lbl.name
FROM    libelle AS lbl
WHERE   EXISTS
        (   SELECT  NULL
            FROM    libelle sel
            WHERE   lbl.id_category = sel.id_category
            HAVING  lbl.priority = MIN(sel.priority)
        )     
ORDER BY lbl.name ASC
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 13h21   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 656
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 656
Points : 2 658
Points : 2 658
bonjour,


PgSql supportant les fonctions de fenêtrage une solution qui fera des scannages en moins :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
WITH tmp AS (
SELECT lca.id_category, lca.name,
row_number() over(partition BY lca.id_category ORDER BY priority) AS rnk
FROM language_category lca
INNER JOIN LANGUAGE lan ON lan.id_language = lca.id_language
INNER JOIN user_language_priority ulp ON ulp.id_language = lan.id_language
WHERE ulp.id_user = 'XXX')
 
SELECT id_category, name 
FROM tmp
WHERE rnk = 1

Alors maintenant, si vous executez la requête à chaque fois que vous avez besoin d'un libellé il faudrai plutôt orienter la requête sur un simple ORDER BY suivit d'un FETCH FIRST 1 ROWS ...
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 14h39   #7
Invité de passage
 
Inscription : avril 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 13
Points : 3
Points : 3
Merci, j'avais pas pensé cette table, je vais tester ça, je vous en redonne des nouvelles.
davland7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 01h06   #8
Invité de passage
 
Inscription : avril 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 13
Points : 3
Points : 3
J'ai réussi affaire quelques chose avec ça

Code :
1
2
3
4
5
6
7
8
WITH tmp AS (SELECT lca.id_category, lca.name,
row_number() over(partition BY lca.id_category ORDER BY lca.id_language DESC) AS rnk
FROM language_category lca
INNER JOIN LANGUAGE lan ON lan.id_language = lca.id_language)
 
SELECT id_category, name 
FROM tmp
WHERE rnk = 1
Utilise ASC et DESC un pour ASC anglais pour id 1 et l'autre pour français id 2 avec deux langues je vais pouvoir me débrouiller pensez-vous que je devrais indexer mes colonnes id

Merci
davland7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 09h19   #9
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 656
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 656
Points : 2 658
Points : 2 658
Bonjour,

Par défaut indexez systématiquement vos foreign key, sauf si celle-ci ne sont jamais utilisée pour faire des jointures.

Les primary key sont déjà indéxée.

Il peut être utile parfois d'indexer la clause where suivit de la clause de jointure sur une même table, si vous avez des problèmes spécifique de perf.

A lire : http://sqlpro.developpez.com/cours/quoi-indexer/
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h47.


 
 
 
 
Partenaires

Hébergement Web