Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Distinct

Estas en el tema de Distinct en el foro de Mysql en Foros del Web. Hola: Estoy intentando hacer una consulta y tengo más o menos ésto Código: SELECT tabla1.id_producto AS producto, tabla2 ....... FROM tabla1, tabla2, tabla3 WHERE ... ...
  #1 (permalink)  
Antiguo 21/03/2007, 16:16
Avatar de TolerantX  
Fecha de Ingreso: marzo-2006
Ubicación: Guadalajara, México.
Mensajes: 408
Antigüedad: 13 años, 8 meses
Puntos: 10
Distinct

Hola:
Estoy intentando hacer una consulta y tengo más o menos ésto
Código:
SELECT tabla1.id_producto AS producto, tabla2 ....... 
FROM tabla1, tabla2, tabla3 
WHERE ... 
ORDER BY tabla3.campo3 DESC"
Pero me salen lagunos registros dublicados en la consulta.
Me supongo que lo soluciono con DISTINCT, pero tengo mis enlaces simbolicos y me salen errores.
Alguna idea?

Estoy utilizando Mysql 4.0.26
__________________
TolerantX
http://tolerantx.com
Linux User #385226
  #2 (permalink)  
Antiguo 21/03/2007, 20:27
Avatar de Edypu  
Fecha de Ingreso: octubre-2003
Ubicación: La Paz - Bolivia
Mensajes: 394
Antigüedad: 16 años, 1 mes
Puntos: 1
Re: Distinct

Copia toda tu consulta ..

luego te ayudo

un saludo.
  #3 (permalink)  
Antiguo 22/03/2007, 16:55
 
Fecha de Ingreso: enero-2004
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 0
Re: Distinct

Como te indica Edypu, dinos cual es la consulta entera para poder ayudarte. Si escribes DISTINCT delante del campo que quieres que no se repita, podrás eliminar duplicados. Ejemplo: SELECT casa, DISTINCT arbol FROM tabla => arrojará como resultados todos los registros pero sin repetir nunca en dos diferentes el mismo dato para arbol.

Pero la mayor parte de las veces los duplicados se deben a un mal diseño de la consulta (no siempre). Es importante saber qué estamos obteniendo de cada tabla y con qué criterios. Para empezar yo relacionaría las tablas con INNER JOIN en lugar de con el WHERE ya que si las tablas tienen muchos registros, te consumirá una barbaridad con esa consulta.

Lo dicho, postea la consulta completa y te intentamos echar un cable.
  #4 (permalink)  
Antiguo 26/03/2007, 10:44
Avatar de TolerantX  
Fecha de Ingreso: marzo-2006
Ubicación: Guadalajara, México.
Mensajes: 408
Antigüedad: 13 años, 8 meses
Puntos: 10
Re: Distinct

Gracias por contestar, bueno va un poco más detallado mi problema.
Tengo dos tablas más o menos de la siguiente manera

Tabla1
id_tabla1
id_producto
id_vendedor
id_cliente

Tabla2
id_tabla2
id_tabla1 (aquí se relaciona con la tabla1)
id_comentario
fecha_comentario

Lo que quiero hacer (que aún no consigo) es hacer una consulta de la tabla1 donde me arroje los registros que contenga unicamente la fecha más alta de la tabla 2 (que es del ultimo comentario que ingresó el vendedor).

Hice algo así con MAX, pero no me arroja el id_tabla2 correcto :S

Código:
SELECT *, MAX(tabla2.fecha_comentario) AS fecha_comentario
FROM tabla1
	INNER JOIN tabla3 ON tabla1.id_producto = tabla3.id_producto
	INNER JOIN tabla4 ON tabla1.id_vendedor = tabla4.id_customer
	INNER JOIN tabla5 ON tabla1.id_cliente = tabla5.id_end_cust
	INNER JOIN tabla2 ON tabla1.id_tabla1 = tabla2.id_tabla1
GROUP BY tabla1.id_tabla1
ORDER BY fecha_comentario DESC
La consulta como comento ya arroja datos correctos, pero el id_tabla2 no, y eso lo necesito para mandar con un enlace a que vean dicho comentario, pero me pone el primero que se encuentra (ya que puede haber varios comentarios sobre un registro de la tabla1). Ojala y me puedan echar una mano.
__________________
TolerantX
http://tolerantx.com
Linux User #385226
  #5 (permalink)  
Antiguo 27/03/2007, 14:40
 
Fecha de Ingreso: enero-2004
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 0
Re: Distinct

Si me he enterado bien, para cada registro de tabla1, hay asociados varios en tabla2. Y se trata de obtener los registros de tabla1 incluyendo para cada uno de ellos el registro correspondiente de la tabla2 cuya fecha sea mayor.

Si es así olvida el distinct. Mejor usa el group by. La idea es agrupar los registros obtenidos por el id común y después meter la clausula having, que actúa sobre cada grupo. Sería algo así:

Código:
SELECT {loquesea} FROM tabla1 INNER JOIN tabla2 USING(id_comun) 
GROUP BY tabla1.id_comun HAVING MAX(tabla2.fecha_comentario)
No estoy nada seguro de que funcione el "max" ahí puesto. Pero la idea base es esa: la clausula "order by" te agrupa los resultados en función del campo que quieras y "having" que actúa como el "where" pero solamente sobre cada grupo, no sobre el total de resultados como lo hace esta última.

Un saludo
  #6 (permalink)  
Antiguo 27/03/2007, 16:39
Avatar de TolerantX  
Fecha de Ingreso: marzo-2006
Ubicación: Guadalajara, México.
Mensajes: 408
Antigüedad: 13 años, 8 meses
Puntos: 10
Re: Distinct

Cita:
Iniciado por javi_bus Ver Mensaje
Código:
SELECT {loquesea} FROM tabla1 INNER JOIN tabla2 USING(id_comun) 
GROUP BY tabla1.id_comun HAVING MAX(tabla2.fecha_comentario)
Gracias por tu respuesta, entiendo la idea, solo que me manda mensajes de de error (sintaxis) igual como dices el MAX no va ahí, seguiré investigando.
__________________
TolerantX
http://tolerantx.com
Linux User #385226
  #7 (permalink)  
Antiguo 11/04/2007, 14:20
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 15 años, 1 mes
Puntos: 1
Re: Distinct

Tengo una consulta similar.
En una tabla tengo distintos registros. Necesito una consulta que me arroje el último registro de cada uno de los distintos comercios.
es decir, la tabla tiene los campos: comercio, importe, fecha.
Se repiten varios nombres, con distintas e iguales fechas. Es decir, suponiendo que hubiera cinco comercios, el comercio 1 tiene por última fecha una venta del día 10 de marzo, el comercio 2 una del día 5 de marzo, etc.
Yo necesito un resultado así: ultima venta comercio 1: 10 de marzo; ultima venta comercio 2: 5 de marzo.
he intentado, pero no funcionó, lo siguiente.
select comercio from compras group by comercio having max(fecha);

también con
select distinct comercio from compras where fecha = (max(fecha));

y tampoco works... ¿qué puedo hacer?
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar

Última edición por arielcasanova; 19/04/2007 a las 15:15
  #8 (permalink)  
Antiguo 19/04/2007, 15:32
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 15 años, 1 mes
Puntos: 1
Re: Distinct

Creo que encontré la solución momentánea: esto devuelve sólo un registro por cada id_tarjeta, mostrando la última fecha... veré cuando haya más registros si sigue funcionando, pero parece que sí:

SELECT MAX(fecha), id_tarjeta FROM compras GROUP BY id_tarjeta HAVING MAX(fecha) >2000-01-01

gracias a todos los que se interesaron.
igual me interesa conocer alternativas, si las hay.
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:47.