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

[SOLUCIONADO] Registros duplicados en mi consulta

Estas en el tema de Registros duplicados en mi consulta en el foro de Mysql en Foros del Web. Tengo estas dos tablas Cita: Editado: Código de programación no permitido en Foros de Bases de Datos. Leer las normas del foro , por favor. ...
  #1 (permalink)  
Antiguo 11/09/2014, 05:45
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 11 años, 4 meses
Puntos: 1
Registros duplicados en mi consulta

Tengo estas dos tablas
Cita:
Editado: Código de programación no permitido en Foros de Bases de Datos.
Leer las normas del foro, por favor.
Quiero sacar todas las reservas de premium_reservation que coincidan con el hotel_code de premium_routes y hago esta consulta
Código MySQL:
Ver original
  1. SELECT * FROM premium_reservation R, premium_routes P
  2. WHERE R.`hotel_code` =  '$hotel' AND R.`hotel_code` = P.`hotel_code`

que me devuelve los valores duplicados, como puedo hacer para que no me duplique los valores? he probado join y me sigue duplicando...

Gracias!!

Última edición por gnzsoloyo; 11/09/2014 a las 07:52
  #2 (permalink)  
Antiguo 11/09/2014, 06:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Registros duplicados en mi consulta

En tanto los datos en las tablas estén bien, no existirá duplicación de registros. Pero no es lo mismo hablar de registros repetidos en prograsmación que en bases de datos.

La consulta queplanteas es un JOIN implícito, que hace referencia a tablas donde hay una relación de cardinalidad 1:N, es decir "uno a muchos".
En ese tipo de consultas, cada registro de la tabla de cardinalidad 1 se repetirá N veces por cada valor único de la tabla con cardinalidad N. Es no es un error ni un defecto, sino un comportamiento normal y esperado.
Sólo existe duplicidad de datos en una consulta si todos y cada uno de los campos entre dos registros cualesquiera tienen exactamente el mismo valro en ambos.
¿Se entiende?
Y no es ese el caso.

Si lo que quieres es que al mostrar la consulta, el resultado de la primera tabla aparezca sólo una vez, y no se visualice nuevamente ese grupo de datos hasta que no cambie al sieguiente registro, a la manera de un reporte, eso es algo que debes hacer tu en la programación, no en la consulta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 11/09/2014, 07:42
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 11 años, 4 meses
Puntos: 1
Respuesta: Registros duplicados en mi consulta

No se si es que no te he entendido bien, pero si hago la consulta en el phpMyadmin me saca los registros duplicados... y hay no hay nada de programación...

Otra cosa, veo que me han quitado las tablas porque supongo que no cumple las normas del foro, pero si le doy al enlace, la pagina de normas del foro no existe...

Como pongo las tablas uqe que podais echarme una mano ya que el codigo que utilice no está permitido¿?
  #4 (permalink)  
Antiguo 11/09/2014, 08:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Registros duplicados en mi consulta

Cita:
Como pongo las tablas uqe que podais echarme una mano ya que el codigo que utilice no está permitido¿?
POn la captura de datos, no los array de PHP... Creo que eso es claro.
El problema del link ya está resuelto.

Cita:
pero si hago la consulta en el phpMyadmin me saca los registros duplicados.
phpMyadmin no es MySQL, es una interfaz programada en PHP para usar MySQL de modo amigable. No lo olvides.

En cuanto a lo de "duplicar", te lo planteo así:
En una tabla de resultado del tipo
Código MySQL:
Ver original
  1. Col1| Col2, Col3| Col4
  2. AAAA| BBBB| CCCC| DDDD
  3. AAAA| BBBB| CCCC| DDDD
  4. AAAB| BBBB| CCCC| DDDD
Los dos primeros registros están repetidos, pero el tercero no. No lo está porque la primera columna contiene un valor diferente al menos en un caracter respecto del las dos anteriores.

En BBDD los registros devueltos en una consulta se evaluan como diferentes como unidad, no por campos separados.

¿Se entiende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 11/09/2014, 08:40
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 11 años, 4 meses
Puntos: 1
Respuesta: Registros duplicados en mi consulta

Pues debo de ser muy cortito jajaja pero no lo entiendo... Como puedo solucionarlo para que los resultados salgan sin estar repetidos, en la consulta no, si no es en la consulta donde?
  #6 (permalink)  
Antiguo 11/09/2014, 09:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Registros duplicados en mi consulta

Vamos al principio...
¿Ves esto que remarco?:

Cita:
Col1| Col2, Col3| Col4
AAAA| BBBB| CCCC| DDDD
AAAB| BBBB| CCCC| DDDD
Ese solo caracter hace que el valor de la primera columna sea diferente al registro anterior, pero como en una consulta, los registros son diferentes si al menos un valor eun una columna es distinto a otro registro, para la base son registros diferentes, no repetidos.

Es decir que
Cita:
AAAA| BBBB| CCCC| DDDD
se considera como unidad, y
Cita:
AAAB| BBBB| CCCC| DDDD
Es otra unidad, diferente de la anterior.

¿Más claro?

Supongamos esto:
Código MySQL:
Ver original
  1. Col1| Col2, Col3| Col4
  2. AAAA| BBBB| CCCC| 1234
  3. AAAA| BBBB| CCCC| 1235
  4. AAAA| BBBB| CCCC| 1348
Si lo que quieres es lograr algo como:

Código MySQL:
Ver original
  1. Col1| Col2, Col3| Col4
  2. AAAA| BBBB| CCCC| 1234
  3.     |     |     | 1235
  4.     |     |     | 1348
Eso no se hace en la consulta, sino en la programación de la vista en pantalla.
¿Cómo?
tema de programación, no de BBDD, dependerá del lenguaje usado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 11/09/2014, 09:37
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 11 años, 4 meses
Puntos: 1
Respuesta: Registros duplicados en mi consulta

A ver, sigo pensando que error esta en la consulta y que no me he explicado bien, no lo se, boya intentar explicarlo detenidamente:

Tengo estas tablas
premium_routes


Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `premium_routes` (
  2.   `ID` BIGINT(15) NOT NULL AUTO_INCREMENT,
  3.   `hotel_code` VARCHAR(225) NOT NULL,
  4.   `route_name` VARCHAR(225) NOT NULL,
  5.   `route_origin` VARCHAR(225) NOT NULL,
  6.   `route_destination` VARCHAR(225) NOT NULL,
  7.   `route_time` VARCHAR(225) NOT NULL,
  8.   `route_price` VARCHAR(100) NOT NULL,
  9.   `route_special` INT(2) NOT NULL DEFAULT '0',
  10.   `route_active` INT(2) NOT NULL DEFAULT '1',
  11.   `route_date_update` VARCHAR(100) NOT NULL,
  12.   `route_date` VARCHAR(100) NOT NULL,
  13.   PRIMARY KEY (`ID`)
  14. ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
  15.  
  16. --
  17. -- Volcado de datos para la tabla `premium_routes`
  18. --
  19.  
  20. INSERT INTO `premium_routes` (`ID`, `hotel_code`, `route_name`, `route_origin`, `route_destination`, `route_time`, `route_price`, `route_special`, `route_active`, `route_date_update`, `route_date`) VALUES
  21. (1, '123456', 'RutaPrueba', 'Calle Falsa 12', 'Mendez Alvaro', '900', '€', 0, 1, '2014-08-25 17:27:56', '2014-07-30 09:42:26'),
  22. (2, '123456', 'prieba2', 'Calle Falsa 12', 'aeropuerto', '1800', '20', 0, 1, '', '2014-08-25 17:30:14'),
  23. (3, '234567890', 'Tren', 'sdfghjk 1', 'Estacion Atocha', '1800', '10', 0, 1, '', '2014-09-03 03:26:49'),
  24. (4, '234567890', 'ruta1', 'sdfghjk 1', 'calle/prueba', '4800', '30', 1, 1, '', '2014-09-04 12:06:53'),
  25. (5, '951951', 'Ruta de prueba', 'C/prueba', 'C/popapa', '1200', '30', 0, 1, '', '2014-09-05 11:01:23'),
  26. (6, '951951', 'Ruta de prueba 2', 'C/prueba', 'c/hola', '5400', '50', 0, 1, '', '2014-09-05 18:32:09'),
  27. (7, '951951', 'ruta 3', 'C/prueba', 'aqui', '3600', '30', 0, 1, '', '2014-09-08 10:02:53');


Premium_reservation

Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `premium_reservation` (
  2.   `ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
  3.   `hotel_code` VARCHAR(225) NOT NULL,
  4.   `route` INT(5) NOT NULL,
  5.   `car_type` VARCHAR(50) NOT NULL,
  6.   `passengers` INT(5) NOT NULL,
  7.   `ticket_date` VARCHAR(100) NOT NULL,
  8.   `ticket_timestamp` VARCHAR(150) NOT NULL,
  9.   `ticket_hash` VARCHAR(225) NOT NULL,
  10.   `ticket_active` INT(1) NOT NULL DEFAULT '1',
  11.   `booking_date` VARCHAR(100) NOT NULL,
  12.   PRIMARY KEY (`ID`)
  13. ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;
  14.  
  15. --
  16. -- Volcado de datos para la tabla `premium_reservation`
  17. --
  18.  
  19. INSERT INTO `premium_reservation` (`ID`, `hotel_code`, `route`, `car_type`, `passengers`, `ticket_date`, `ticket_timestamp`, `ticket_hash`, `ticket_active`, `booking_date`) VALUES
  20. (1, '123456', 1, 'car', 4, '2014-08-27 17:00', '1409156100', '2d43761618543dafa21496163db74da9', 1, '2014-08-25 17:06:00'),
  21. (2, '123456', 1, 'mini', 3, '2014-08-28 18:15', '1409243400', '974e7071410f4ad03ff7121c6031347e', 1, '2014-08-25 17:28:58'),
  22. (3, '123456', 1, 'car', 1, '2014-09-03 14:15', '1409747400', 'f71683e8759d552d74998c6dbd72282c', 1, '2014-09-02 14:18:47'),
  23. (4, '123456', 1, 'car', 1, '2014-09-19 03:15', '1411090200', '7f4846b4b39b69f23145aa1a98417611', 1, '2014-09-03 03:24:20'),
  24. (5, '123456', 1, 'car', 1, '2014-09-19 03:15', '1411090200', 'b9007216bc499f97d168e322d0d47cea', 1, '2014-09-03 03:24:31'),
  25. (6, '123456', 1, 'car', 1, '2014-09-18 03:15', '1411003800', 'f3fe031d2c09630e687a0a33da22b63c', 1, '2014-09-03 03:24:42'),
  26. (7, '123456', 1, 'car', 2, '2014-09-21 04:30', '1411267500', 'c177422a457f90f1601d7b42efcacc08', 1, '2014-09-10 11:03:47'),
  27. (8, '123456', 1, 'car', 3, '2014-09-21 11:00', '1411290900', '13fc2946b62e32f5c43baf340cd6026a', 1, '2014-09-10 11:04:08'),
  28. (9, '123456', 1, 'car', 1, '2014-09-18 11:45', '1411034400', '2710655437a4b5dc4b5a0d91ed38be09', 1, '2014-09-10 11:55:58'),
  29. (10, '123456', 1, 'mini', 6, '2014-09-13 12:45', '1410606000', '43aa2251b0e36e3fad76a585b06ab485', 1, '2014-09-10 12:53:44'),
  30. (11, '123456', 1, 'mini', 5, '2014-09-13 12:45', '1410606000', '4584ac4f9f33b4176a05ee0ba2a1c890', 1, '2014-09-10 12:54:11');


La idea es que tengo que sacar todos los datos de la tabla premium_reservation y necesito el campo premium_route.route_destination de la otra tabla.

Para ello hice esta consulta
Código MySQL:
Ver original
  1. SELECT * FROM premium_reservation R, premium_routes P
  2. WHERE R.`hotel_code` = '123456' AND R.`hotel_code` = P.`hotel_code`


La única union que veo entre las dos es el campo hotel_code de ahí que haga la union entre las dos tablas con ese campo.

Este es el resultado que me da
Cita:
Ediutado: Codigo de programacion no permitido en foros de BBDD
y sigue para abajo repitiendo resgitros...

Como podeis ver, el ID se duplica... no se si me explico, si soy un poco cabezón que, pero en esto de las consultas y eso me cuesta un poco mas...

Espero a ver sido claro..

En caso de que efectivamente sea problema de la programación el lenguaje utilizado es php, pero no se me ocurre como puedo solucionarlo desde ahí.

Gracias

Última edición por gnzsoloyo; 11/09/2014 a las 09:56
  #8 (permalink)  
Antiguo 11/09/2014, 09:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Registros duplicados en mi consulta

La tabla PREMIUM_ROUTES tiene dos registros donde HOTEL_CODE contiene el valor "123456", y la tabla PREMIUM_RESERVATION contiene once (11) registros con ese mismo valor en igual campo.
Por consecuencia, como tu estás relacioando ambas tablas sólo por ese campo, te devolvera 22 registros, ya que relaciona cada uno de los dos de laprimera con cada uno de los once de la segunda.
Pero si lo analizas campo a campo, no son duplicaciones. Si los comparas campo a campo a cada par, verás que no existe en ningun caso un dos registros que sean iguales en todos los valores, en especial porque usas el asterisco...

NO hay duplicación. Podrías usar DISTINCT, pero el resutado sería el mismo.

Trata de entender esto: Si entre dos registros cualesquiera, en uno de los campos, hay al menos UN CARACTER DIFERENTE entre dos registros, los registros ENTEROS se cosideran DIFERENTES en BBDD.

PD: no postees código PHP, ya te lo he dicho. Postea la tabla de datos resultante, para l ocual si quieres poner una captura de pantalla, puedes...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 11/09/2014, 10:01
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 11 años, 4 meses
Puntos: 1
Respuesta: Registros duplicados en mi consulta

ok, lo siento, no sabía como ponerlo, en fin, que la solución pasa por evitar esa "duplicación" con programación... y como lo hago? lo unico que hago es mostrar registro por registro con un foreach... como hago esa distincion en php?
  #10 (permalink)  
Antiguo 11/09/2014, 10:05
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Registros duplicados en mi consulta

El problema no es la consuulta y probablemente no sea el resultado. Es que no tienes claro lo que quieres obtener de información.
¿Realmente necesitas todos los campos?
¿Debes tomar si o sí los DOS registros de la primera tabla?
¿Debería devolver sólo uno en ese caso? ¿Cuál?

A mi entender, el problema es que las condiciones del where son insuficientes apra descartar esa duplicidad aparente. En pocas palabras: No alcanza sólo con el HOTEL_CODE para relacionar ambas tablas.
¿Cómo se vinculan los registros de una a otra tabla?
¿Estás seguro que sólo neesitas ese dato?

Respecto a la imagen del resultado, sería mucho más sencillo que trabajes con la consola de MySQL, se consiguen mejores cosas para postear.
de todos modo ya te dije: Captura de pantalla... ¿Nunca subiste imagenes a un sitio compartido, desde donde linkeas la IMG?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 11/09/2014, 10:31
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 11 años, 4 meses
Puntos: 1
Respuesta: Registros duplicados en mi consulta

no, nunca, pero creo que lo he solucionado, estoy trabajando en una aplicación que ya estaba empezada y buscando buscando he encontrado la respuesta:

Código MySQL:
Ver original
  1. SELECT BB.*, CC.route_origin, CC.route_destination
  2.       FROM premium_reservation BB, premium_routes CC
  3.    
  4.     WHERE BB.hotel_code = '$hotel' AND BB.ticket_active = 1 AND BB.route = CC.ID
  5.     ORDER BY BB.ID $limit

Y ahora entendi que hay un campo que hace conexión entre las dos tablas... ID y route, resulta que eso era lo que buscaba y no daba con el, porque? porque estoy mareado ya jajaja

A veces merece la pena pararse u poco a estudiar lo que tienes en frente en vez de ponerse nervioso y plantear tu duda como yo lo he hecho, sin información suficiente...

Gracias!!!!

Última edición por gnzsoloyo; 11/09/2014 a las 10:40 Razón: incompleto

Etiquetas: duplicados, join, registros, select, tabla
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:05.