Re: Une recherche sur plusieurs lignes ?

From: François Figarola <francois(dot)figarola(at)i-consult(dot)fr>
To: Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Une recherche sur plusieurs lignes ?
Date: 2009-08-17 14:25:09
Message-ID: 4A896845.1050903@i-consult.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Samuel ROZE a écrit :
> Bonjour à tous,
>
> Je m'adresse à vous pour avoir un peu d'aide car en ce moment même, je
> suis confronté à une situation assez compliquée. (A mon sens, peut-être
> qu'elle est très simple en réalité :) ).
>
> J'ai trois tables comme ceci:
>
> +--------------+ +----------------+ +--------------+
> | context_list | | context_values | | context_keys |
> +--------------+ +----------------+ +--------------+
> | SERIAL "id" | <-> | int "context" | |-> | SERIAL "id" |
> | text "desc" | | int "key" | <-| | text "name" |
> +--------------+ | text "value" | +--------------+
> +----------------+
>
> Elles décrivent des élements appelés "context".
> - Dans "context_list", il y a "id", l'ID du context et sa description
> - Dans "context_keys", il y a des clés de valeurs. Cette table permet de
> mettre un ID dans "context_values", ce qui permet d'économiser de la
> place et éviter les redondances de noms de clés.
> - Dans "context_values", il y a les associations context/clés/valeurs.
>
> Il peut il avoir plusieurs couples clé/valeur par context.
>
> Maintenant, j'ai une description du context sous forme de tableau
> associatif tel que:
> Array(
> [field1] => 'value1',
> [field2] => 'value2'
> )
>
> J'ai donc dans ma base de données une ligne dans "context_list", deux
> dans "context_keys" (field1, field2 pour le champ "name") et deux dans
> "context_values".
>
> Je souhaites, en une requête, obtenir l'ID du context qui as ces couples
> clé/valeur. Est-ce possible ?
> En une requête car je souhaiterais utiliser cette requête comme une
> sous-requête.
>
> Merci d'avance.
> Cordialement, Samuel ROZE.
>
>
>
Bonjour,

Je ne sais pas si j'ai réellement cerné ton problème en ce chaud après-midi
d'août, mais pourquoi ne pas créer une vue effectuant les jointures de ces
3 tables :

CREATE VIEW contextes AS
SELECT v.context as idcontext, c.desc as context, k.name as key, v.value
FROM context_values as v
INNER JOIN context_list as c ON v.context=c.id
INNER JOIN context_keys as k ON v.key=k.id

Vue que tu pourras interroger simplement :

SELECT idcontext, contexte FROM contextes
WHERE key='clé???' AND valeur='????'

ou pour en revenir à ta demande, simplement utiliser la
requête de création de la vue comme sous-requête :

SELECT v.context as idcontext, c.desc as context
FROM context_values as v
INNER JOIN context_list as c ON v.context=c.id
INNER JOIN context_keys as k ON v.key=k.id
WHERE k.name='clé????' AND v.value='valeur?????'

Par contre, en fonction du nombre d'enregistrements à prévoir,
mieux vaudrait indexer les champs 'text' sur lesquels s'effectueront
les tris.

Cordialement.

--
François Figarola
-- développeur --
=================
INTERNET CONSULT
Mas Guerido
6 rue Aristide Bergès
66330 CABESTANY

Tel 04.68.66.09.29
fax 04.68.66.99.50
* francois(dot)figarola(at)i-consult(dot)fr

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Samuel ROZE 2009-08-17 14:33:41 Re: Une recherche sur plusieurs lignes ?
Previous Message Samuel ROZE 2009-08-17 13:47:04 Re: Une recherche sur plusieurs lignes ?