Javier Chávez B. escribió:
On Thu, Jan 29, 2009 at 4:35 PM, "I.N.T. - Programación"
<dpto.programac...@grupo-int.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 ...

--
TIP 4: No hagas 'kill -9' a postmaster

Responder a