Agrupar una consulta con selección

From: "I(dot)N(dot)T(dot) - Programación" <dpto(dot)programacion(at)grupo-int(dot)com>
To: POSTGRESQL - Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Agrupar una consulta con selección
Date: 2009-01-30 07:57:02
Message-ID: 4982B2CE.2080302@grupo-int.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Ya lo he resuelto, no era tan complicado. Al final...

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 ...

*******

Sería algo tan sencillo como...

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;

Y desde el script PHP enviar sobre la vista la consulta que necesite...

Ejemplo 1:
SELECT id_socio, nombre FROM view_socios WHERE nombre LIKE 'LUIS' GROUP
BY id_socio, nombre ORDER BY nombre;

Ejemplo 2:
SELECT id_socio, nombre FROM view_socios WHERE nombre LIKE 'LUIS' AND
id_tienda=15 GROUP BY id_socio, nombre ORDER BY nombre;

Ejemplo 3:
SELECT id_socio, nombre FROM view_socios WHERE id_tienda=15 GROUP BY
id_socio, nombre ORDER BY nombre;

No entiendo cómo me he podido liar tanto...

Gracias a todos...

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Gabriel Ferro 2009-01-30 10:12:46 Re: [pgsql-es-ayuda] Encoding caracter º
Previous Message Gabriel Hermes Colina Zambra 2009-01-30 01:21:54 Re: Npgsql Crystal Rep