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

Re: [pgsql-es-ayuda] Agrupar una consulta con selección del primer elemento

From: "I(dot)N(dot)T(dot) - Programación" <dpto(dot)programacion(at)grupo-int(dot)com>
To: "Javier Chávez B(dot)" <jchavezb(at)gmail(dot)com>, POSTGRESQL - Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: [pgsql-es-ayuda] Agrupar una consulta con selección del primer elemento
Date: 2009-01-29 17:50:28
Message-ID: 4981EC64.9010602@grupo-int.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Javier Chávez B. escribió:
> On Thu, Jan 29, 2009 at 4:35 PM, "I.N.T. - Programación"
> <dpto(dot)programacion(at)grupo-int(dot)com> wrote:
>   
>> Buenas tardes,
>>
>> Tengo las 3 tablas:
>>
>> CREATE TABLE socios
>> (
>>  id_socio integer NOT NULL DEFAULT nextval('"socios_seq"'::text),
>>  nombre character varying(250),
>>  dni character varying(250),
>>  etc...
>>
>> CREATE TABLE tarjetas_socios
>> (
>>  id_tarjeta integer NOT NULL DEFAULT 0,
>>  id_socio integer NOT NULL DEFAULT 0
>> )
>>
>> CREATE TABLE tarjetas
>> (
>>  id_tarjeta integer NOT NULL DEFAULT nextval('"tarjetas_seq"'::text),
>>  id_tienda integer DEFAULT 0,
>>  etc...
>>
>> Y tengo la siguiente consulta:
>>
>> CREATE OR REPLACE VIEW view_socios AS
>> SELECT socios.nombre, socios.dni, tarjetas.id_tienda
>>  FROM socios, tarjetas_socios, tarjetas
>>  WHERE socios.id_socio = tarjetas_socios.id_socio AND
>> tarjetas_socios.id_tarjeta = tarjetas.id_tarjeta
>>  GROUP BY socios.nombre, socios.dni, tarjetas.id_tienda;
>>
>> Al ejecutar la vista muestra algo como:
>>
>> nombre         dni                 id_tienda
>> -------------------------------------
>> LUIS            123456         15
>> LUIS            123456         11
>> LUIS            123456         47
>> ANDRES     987654         12
>> ANDRES     987654         15
>> MIGUEL      555555         7
>>
>> etc...
>>
>> Necesitaría que el resultado de la vista fuera algo como:
>>
>> nombre         dni                 id_tienda
>> -------------------------------------
>> LUIS            123456         15
>> ANDRES     987654         12
>> MIGUEL      555555         7
>>
>> etc...
>>
>> Es decir, teniendo en cuenta el agrupamiento por los 2 primeros campos y
>> CUALQUIER VALOR del tercero (el primero, el último, da igual), pero que no
>> duplique al socio. ¿No existe una consulta en PostgreSQL del tipo ...
>>
>> CREATE OR REPLACE VIEW view_socios AS
>> SELECT socios.nombre, socios.dni, tarjetas.id_tienda
>>  FROM socios, tarjetas_socios, tarjetas
>>  WHERE socios.id_socio = tarjetas_socios.id_socio AND
>> tarjetas_socios.id_tarjeta = tarjetas.id_tarjeta
>>  GROUP BY socios.nombre, socios.dni, first(tarjetas.id_tienda);
>>
>> ... (como en access, ¡¡¡lo siento!!!)? ¿Y de alguna otra forma?
>>
>> Gracias de antemano por vuestra ayuda
>>
>> --
>> TIP 4: No hagas 'kill -9' a postmaster
>>
>>     
>
> Probaste con un Max ???
>
> algo asi :
>
> SELECT   socios.nombre,
>                 socios.dni,
>                 Max(tarjetas.id_tienda)
>  FROM socios, tarjetas_socios, tarjetas
>  WHERE socios.id_socio = tarjetas_socios.id_socio AND
> tarjetas_socios.id_tarjeta = tarjetas.id_tarjeta
>  GROUP BY socios.nombre, socios.dni;
>
> Puede ser???
>
> Slds.
>
> J
>
>   
Voy a explicarlo mejor...

Tengo las 3 tablas:

CREATE TABLE socios	// nos olvidamos de 'dni' (que sería otro campo de búsqueda)
(
 id_socio integer NOT NULL DEFAULT nextval('"socios_seq"'::text),
 nombre character varying(250),
 etc...

CREATE TABLE tarjetas_socios
(
 id_tarjeta integer NOT NULL DEFAULT 0,
 id_socio integer NOT NULL DEFAULT 0
)

CREATE TABLE tarjetas
(
 id_tarjeta integer NOT NULL DEFAULT nextval('"tarjetas_seq"'::text),
 id_tienda integer DEFAULT 0,
 etc...

Un socio (id_socio) puede tener varias tarjetas (id_tarjeta) adquiridas 
en distintas tiendas (id_tienda)

La consulta la quiero para realizar una paginación (nº total de socios, 
no duplicados) en un script PHP (con detalles de los 'socios', el 
etc...) cuyos resultados se obtienen introduciendo 1 ó 2 parámeros: el 
nombre del socio y/o la tienda (son más, pero para explicarme me vale).

Suponemos que tengo la vista ...

CREATE OR REPLACE VIEW view_socios AS
SELECT socios.id_socio, socios.nombre, tarjetas.id_tienda
 FROM socios, tarjetas_socios, tarjetas
 WHERE socios.id_socio = tarjetas_socios.id_socio AND
tarjetas_socios.id_tarjeta = tarjetas.id_tarjeta;

(sin el agrupamiento)

Me da un recordet tal que ...

id_socio	nombre          id_tienda
-----------------------------------------
37		LUIS            15
37		LUIS            15
37		LUIS            11
37		LUIS            47
24		ANDRES          12
24		ANDRES          15
92		LUIS            15
81		LUIS            14
11		MIGUEL          7
etc...

Si en la vista digo que el socio sea 'LUIS' me mostrará 6 registros 
cuando quiero que sólo me muestre 3 (fijaos que aunque se llamen igual 
hay 3 socios llamados 'LUIS' -el 37, el 92 y el 81- que son distintos, 
me da igual la tienda porque no he buscado por ella).

Si en la vista digo que el socio sea 'LUIS' comprando en la tienda 15 me 
mostrará 3 registros cuando quiero que sólo me muestre 2 (sólo hay 2 
socios DISTINTOS -el 37 y el 92- que son 'LUIS' y compran en esa tienda).

Si en la vista digo que la compra sea en la tienda 15 me mostrará 4 
registros cuando quiero que sólo me muestre 3 (los socios 'LUIS' -el 37 
y el 92- y 'ANDRES' -el 24-).

No se si me explico...

¿Cómo "agrupo" la consulta anterior?

Gracias de nuevo ...


In response to

pgsql-es-ayuda by date

Next:From: I.N.T. - ProgramaciónDate: 2009-01-29 17:51:47
Subject: Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Agrupar una consulta con selección del primer elemento
Previous:From: Antonio GaliciaDate: 2009-01-29 17:46:01
Subject: Re: COPY FROM con Comillas dobles

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