Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-fr-generale by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group