Re: Une recherche sur plusieurs lignes ?

From: Ludovic Levesque <luddic(at)gmail(dot)com>
To: pgsql-fr-generale(at)postgresql(dot)org
Cc: Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>
Subject: Re: Une recherche sur plusieurs lignes ?
Date: 2009-08-19 10:03:51
Message-ID: 162718d40908190303q4ba68576l1c55d122719ca6e5@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Bonjour Samuel,

c'est un peu tiré par les cheveux et pas forcément très performant si
jamais tu as beaucoup de rows, mais c'est facilement adaptable à
plusieurs couples clés/valeurs:

SELECT
context_values.context
FROM
context_keys
INNER JOIN context_values ON context_values.key = context_keys.id
WHERE TRUE
AND context_keys.name IN ('label1', 'label2')
AND context_values.value IN ('value3', 'value4')
AND ARRAY[context_keys.name, context_values.value] IN (
ARRAY['label1', 'value3'],
ARRAY['label2', 'value4']
)
GROUP BY
context_values.context
HAVING
COUNT(DISTINCT ARRAY[context_keys.name, context_values.value]) = 2
;

Ludo

2009/8/19 Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>:
> Bonjour,
>
> Tout d'abord merci de vous pencher sur mon problème. C'est intéressant,
> seulement, dans mon exemple il y a deux couples clé/valeur à rechercher.
> Or il se peut que j'en ai un ou cinq...ou dix.. (très très rare mais
> quand même)
>
> Merci !
>
> Le mercredi 19 août 2009 à 08:39 +0200, Guillaume Lelarge a écrit :
>> Le mercredi 19 août 2009 à 00:52:51, Samuel ROZE a écrit :
>> > Bonjour,
>> >
>> > En concordance avec mon exemple précédent, voici les trois tables avec
>> > quelques enregistrements:
>> >
>> > CREATE TABLE context_keys (
>> >   id SERIAL,
>> >   name text NOT NULL
>> > );
>> > INSERT INTO context_keys (id, name) VALUES
>> > (1, 'label1'),
>> > (2, 'label2');
>> >
>> >
>> > CREATE TABLE context_list (
>> >   id SERIAL
>> > );
>> > INSERT INTO context_list (id) VALUES
>> > (1),
>> > (2);
>> >
>> >
>> > CREATE TABLE context_values (
>> >   context integer NOT NULL,
>> >   key integer NOT NULL,
>> >   value text NOT NULL
>> > );
>> > INSERT INTO context_values (context, key, value) VALUES
>> > (1, 1, 'somethink'),
>> > (1, 2, 'value2'),
>> > (2, 1, 'value3'),
>> > (2, 2, 'value4');
>> >
>> >
>> > Je veux avoir l'ID du context (clé "id" de la table "context_list") qui
>> > a la clé "label1" = 'value3' ET "label2" = 'value4'. C'est l'ID #2. Mais
>> > comment avoir ce résultat en une seule requête.. Bonne question :-)
>> >
>>
>> Ceci est la première chose qui me vient en tête:
>>
>> select cv1.context
>> from context_values as cv1, context_values as cv2
>> where cv1.key in (select id from context_keys where name='label1')
>>         and cv1.value='value3'
>>   and cv2.key in (select id from context_keys where name='label2')
>>         and cv2.value='value4'
>>   and cv1.context=cv2.context;
>>
>> À noter qu'en 8.4, on ferait plutôt ça:
>>
>> with
>>   ck1 as (select id from context_keys where name='label1'),
>>   ck2 as (select id from context_keys where name='label2')
>> select cv1.context
>> from context_values as cv1, context_values as cv2, ck1, ck2
>> where cv1.key=ck1.id and cv1.value='value3'
>>   and cv2.key=ck2.id and cv2.value='value4'
>>   and cv1.context=cv2.context;
>>
>> ce qui n'est que deux fois plus rapide.
>>
>> Ce qui me fait penser que ceci est une version améliorée de la première:
>>
>> select cv1.context
>> from context_values as cv1, context_values as cv2,
>>      context_keys as ck1, context_keys as ck2
>> where cv1.key=ck1.id and cv1.value='value3'
>>   and cv2.key=ck2.id and cv2.value='value4'
>>   and cv1.context=cv2.context
>>   and ck1.name='label1'
>>   and ck2.name='label2';
>>
>> Même perfs que la requête CTE.
>>
>>
>
>
> --
> Sent via pgsql-fr-generale mailing list (pgsql-fr-generale(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-fr-generale
>

In response to

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Guillaume Lelarge 2009-08-19 10:23:45 Re: Une recherche sur plusieurs lignes ?
Previous Message Samuel ROZE 2009-08-19 09:39:16 Re: Une recherche sur plusieurs lignes ?