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"
<[email protected]> 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...
--
TIP 2: puedes desuscribirte de todas las listas simultáneamente
   (envía "unregister TuDirecciónDeCorreo" a [email protected])

Responder a