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