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

Resultados duplicados al utilizar OR

Estas en el tema de Resultados duplicados al utilizar OR en el foro de Mysql en Foros del Web. Que tal, Tengo un problema que me ha molestado toda la mañana. Tengo una tabla de creditos donde cada que se hace una transacción, se ...
  #1 (permalink)  
Antiguo 09/06/2012, 09:55
 
Fecha de Ingreso: mayo-2012
Mensajes: 7
Antigüedad: 11 años, 11 meses
Puntos: 0
Pregunta Resultados duplicados al utilizar OR

Que tal,

Tengo un problema que me ha molestado toda la mañana. Tengo una tabla de creditos donde cada que se hace una transacción, se agrega la fecha y hora que se agrego la transacción, de que usuario y a que usuario, cada fila tiene su identificador unico.

Mi problema es al tratar de obtener todas las transacciones en las que está involucrado un usuario, por ejemplo quiero todas las transacciones donde el usuario juanito envió creditos a otra persona y donde otra persona le paso creditos a juanito.

Tengo el siguiente query:
Código PHP:
$query "SELECT * FROM credits WHERE to_user_id = ".$reseller_id." OR from_user_id = ".$reseller_id." ORDER BY id DESC "
El problema es que de esta manera obtengo todos los registros donde to_user_id = juanito y despues duplica la información y me regresa todos los usuarios donde from_user_id = juanito.

Obtengo esto:
Código HTML:
<table><tr><td>68</td><td>5</td><td>2012-02-17 14:16:20</td> <td>Admin</td><td>Juanito</td></tr><tr><td>68</td><td>5</td><td>2012-02-17 14:16:20</td> <td>Admin</td><td>Juanito</td></tr></table> 
Entiendo por que lo está haciendo, lo que hace es que pone el resultado de uno y luego se agarra poniendo resultados del otro pero esto hace que se dupliquen identificadores.

Alguien sabe como hacer esto de una mejor manera?

Saludos!
  #2 (permalink)  
Antiguo 09/06/2012, 10:18
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: Resultados duplicados al utilizar OR

Cita:
Alguien sabe como hacer esto de una mejor manera?
Es que no hay una mejor manera... depende de lo que quieras obtener.
Lo que tienes que hacer es definir qué es exactamente lo que quieres:
- Los créditos dados por Juanito.
- Los créditos recibidos por Juanito.
- Ambas cosas.
Es obvio que la consulta es correcta, si lo que quieres es tener la lista de operaciones en las que está involucrado el mismo usuario. El tema es que si vas a hacer cosas diferentes con cada una de las dos opciones, entonces tienes que armar diferentes consultas, o bien armar una consulta que te de los datos que necesitas ya consolidados.

Código MySQL:
Ver original
  1. FROM credits
  2.     to_user_id = ".$reseller_id."
  3.     OR
  4.     from_user_id = ".$reseller_id."

Explica mejor qué es lo que quieres hacer con el listado, o si lo que necesitas es hacer cálculos de algún tipo.
__________________
¿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 09/06/2012, 10:41
 
Fecha de Ingreso: mayo-2012
Mensajes: 7
Antigüedad: 11 años, 11 meses
Puntos: 0
Pregunta Respuesta: Resultados duplicados al utilizar OR

Gracias por tu respuesta, Lo que necesitaba hacer era basicamente tener un listado de transacciones como en el banco, esto significa que si juanito recibio creditos de otro usuario hay que ponerlo ahí, también si juanito envió creditos a otro usuario.

Lo que obtengo con ese query es eso mismo, pero al desplegarlo obtenia un array con 2 filas iguales ya que MySQL supongo que verificaba la primera condición y despues la segunda.

Lo que hice fue lo siguiente:

Código PHP:
//creé un array $keys
$keys = array();

//Luego inclui los identificadores (que son unicos) dentro de un foreach
foreach($history as $key => $val){
    if(!
in_array($val['id'],$keys)){
        
$keys[] = $val['id'];
                
$transactions .= '<tr class="neutral">
                                <td>'
.$val['id'].'</td>
                                <td>'
.$val['credits'].'</td>
                                <td>'
.$val['app_date'].'</td>
                                <td>'
.$from_user['username'].'</td>
                                <td>'
.$to_user['username'].'</td>
                            </tr>'
;
    }

Esto resolvio mi problema, aunque si quisiera saber si se puede hacer de otra manera desde MySQL.

Espero haberme explicado.
  #4 (permalink)  
Antiguo 09/06/2012, 11:38
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: Resultados duplicados al utilizar OR

Es posible que haya otra manera, pero francamente yo no entiendo qué hace ese código que pusiste, porque yo no trabajo en PHP habitualmente ni en HTML, y ese código a mi no me dice nada respecto a lo que representa en pantalla.
En este foro la norma es que no se deben tratar temas de programación y los códigos de programación no están permitidos. Por favor, no los pongas. Aquí se trabaja con SQL, no con PHP o lo que sea.

Finalmente, respecto a lo que me dices
Cita:
quisiera saber si se puede hacer de otra manera desde MySQL.
primero deberíamos saber qué cuernos representa eso que pusiste: ¿Es un resumen? ¿Un listado? ¿un reporte? ¿va ordenado según un criterio? ¿tiene algún tipo de totalizadores? ¿las columnas se toman de cada columna, o de cada registro? ¿es una tabla inversa?
Si me dices exactamente qué es lo que muestra como información, te puedo decir cómo hacer eso en una sola consulta o algo así. Pero dime lo que tiene que mostrar, no pongas códigos que no son SQL...

Y por favor, no PHP.
__________________
¿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 09/06/2012, 12:16
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 7 meses
Puntos: 381
Respuesta: Resultados duplicados al utilizar OR

Creo que el problema al que fernandog07 se refiere es a que le sale cada registro 2 veces
__________________
Javascript Códigos - Bambú difunde
  #6 (permalink)  
Antiguo 09/06/2012, 13:23
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: Resultados duplicados al utilizar OR

Si, eso lo veo, pero lo que sucede es que en realidad no hay repeticiones en el sentido estricto, sino que le aparecen en el mismo listado tanto los registros del crédito recibido, como del crédito emitido. Lo que no me queda claro es cómo quiere representar esa información, o si la misma lleva algún tipo de agregaciones.
Me gustaría que postee un ejemplo de cómo quiere los datos.
__________________
¿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 09/06/2012, 13:39
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 7 meses
Puntos: 381
Respuesta: Resultados duplicados al utilizar OR

Eso pensaba al principio pero mirando la tabla html que dejó en el primer mensaje se ve cómo sale el mismo registro repe, es decir, si emitió hay un registro de crédito, y si recibió se creó otro registro, cada registro con su id y sale el mismo registro duple


Código:
68  5  2012-02-17 14:16:20  Admin  Juanito 

68  5  2012-02-17 14:16:20  Admin  Juanito
Supongo que desde sql habría de pedir DISTINCT id
  #8 (permalink)  
Antiguo 09/06/2012, 15:13
 
Fecha de Ingreso: mayo-2012
Mensajes: 7
Antigüedad: 11 años, 11 meses
Puntos: 0
Pregunta Respuesta: Resultados duplicados al utilizar OR

Cita:
Iniciado por gnzsoloyo Ver Mensaje

Finalmente, respecto a lo que me dices primero deberíamos saber qué cuernos representa eso que pusiste: ¿Es un resumen? ¿Un listado? ¿un reporte? ¿va ordenado según un criterio? ¿tiene algún tipo de totalizadores? ¿las columnas se toman de cada columna, o de cada registro? ¿es una tabla inversa?
Si me dices exactamente qué es lo que muestra como información, te puedo decir cómo hacer eso en una sola consulta o algo así. Pero dime lo que tiene que mostrar.
Es un reporte o listado, tengo una tabla con las siguientes columnas:

ID, APP_DATE, FROM_USER_ID, TO_USER_ID, CREDITS

donde:
ID = Primary Key
APP_DATE = Fecha de creación del registro
FROM_USER_ID = Columna ligada a tabla USERS que identifica el usuario que va a enviar el credito
TO_USER_ID = Columna ligada a tabla USERS que identifica el usuario que va a recibir el credito
CREDITS = Cantidad de creditos de la transacción (puede ser negativo)

Supongamos que tengo los siguientes registros:

68, 12-07-08 10:32:00, 1, 2, 3
69, 12-07-08 10:32:02, 1, 3, 1
70, 12-07-08 10:33:00, 2, 3, 2
71, 12-07-08 10:34:00, 0, 2, -2

lo que quiero hacer en MySQL es, Seleccionar todos los registros en los que se encuentre USER_ID = 2, cuando utilizo:

Código MySQL:
Ver original
  1. FROM credits
  2.     to_user_id = 2
  3.     OR
  4.     from_user_id = 2

Obtengo lo siguiente:
68, 12-07-08 10:32:00, 1, 2, 3
70, 12-07-08 10:33:00, 2, 3, 2
71, 12-07-08 10:34:00, 0, 2, -2
71, 12-07-08 10:34:00, 0, 2, -2
70, 12-07-08 10:33:00, 2, 3, 2
68, 12-07-08 10:32:00, 1, 2, 3

y quiero obtener solamente esto:
71, 12-07-08 10:34:00, 0, 2, -2
70, 12-07-08 10:33:00, 2, 3, 2
68, 12-07-08 10:32:00, 1, 2, 3

Se estan duplicando los resultados por el OR de la consulta, no soy experto en MySQL es por eso que estoy pidiendo ayuda para tratar de obtener ese resultado dentro de la misma consulta.

Espero haberme explicado y disculpen si les hago perder su tiempo posteando php en un foro de MySQL, es solo que estoy acostumbrado a utilizar los dos.
  #9 (permalink)  
Antiguo 09/06/2012, 15:16
 
Fecha de Ingreso: mayo-2012
Mensajes: 7
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: Resultados duplicados al utilizar OR

Cita:
Iniciado por tunait Ver Mensaje
Eso pensaba al principio pero mirando la tabla html que dejó en el primer mensaje se ve cómo sale el mismo registro repe, es decir, si emitió hay un registro de crédito, y si recibió se creó otro registro, cada registro con su id y sale el mismo registro duple

Supongo que desde sql habría de pedir DISTINCT id
Exactamente es lo que está pasando, intente utilizar DISTINCT id, pero no me funciono, talvez no lo se utilizar bien?
  #10 (permalink)  
Antiguo 09/06/2012, 15:19
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 7 meses
Puntos: 381
Respuesta: Resultados duplicados al utilizar OR

Cita:
Iniciado por fernandog07 Ver Mensaje
Exactamente es lo que está pasando, intente utilizar DISTINCT id, pero no me funciono, talvez no lo se utilizar bien?
¿cómo se lo pediste?
  #11 (permalink)  
Antiguo 09/06/2012, 15:33
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: Resultados duplicados al utilizar OR

Fernandog07, el resultado que estás obteniendo no es por la consulta, porque la misma debería estar dandote la respuesta correcta.
Mira, si tomo el ejemplo de datos que nos das, y el esquema de tabla indicado, y además la propia consulta que haces, obtengo lo siguiente:
Código MySQL:
Ver original
  1. mysql> CREATE TABLE credits(ID int unsigned Primary Key,
  2.     ->     APP_DATE datetime,
  3.     ->     FROM_USER_ID int unsigned,
  4.     ->     TO_USER_ID int unsigned,
  5.     ->     CREDITS int);
  6. Query OK, 0 rows affected (0.01 sec)
  7.  
  8. mysql> INSERT INTO credits
  9.     -> VALUES
  10.     ->     (68, '12-07-08 10:32:00', 1, 2, 3),
  11.     ->     (69, '12-07-08 10:32:02', 1, 3, 1),
  12.     ->     (70, '12-07-08 10:33:00', 2, 3, 2),
  13.     ->     (71, '12-07-08 10:34:00', 0, 2, -2);
  14. Query OK, 4 rows affected (0.00 sec)
  15. Records: 4  Duplicates: 0  Warnings: 0
  16.  
  17. mysql> SELECT *
  18.     -> FROM credits
  19.     -> WHERE
  20.     ->     to_user_id = 2
  21.     ->     OR
  22.     ->     from_user_id = 2
  23.     -> ORDER BY id DESC;
  24. +----+---------------------+--------------+------------+---------+
  25. | ID | APP_DATE            | FROM_USER_ID | TO_USER_ID | CREDITS |
  26. +----+---------------------+--------------+------------+---------+
  27. | 71 | 2012-07-08 10:34:00 |            0 |          2 |      -2 |
  28. | 70 | 2012-07-08 10:33:00 |            2 |          3 |       2 |
  29. | 68 | 2012-07-08 10:32:00 |            1 |          2 |       3 |
  30. +----+---------------------+--------------+------------+---------+
  31. 3 rows in set (0.00 sec)

En otras palabras: la duplicación de datos no se está produciendo en la consulta que haces, sino en otra parte. Y si no es la consulta... sólo queda que algo se está haciendo mal con los datos que se obtienen, pero en la aplicación...
Haz lo siguiente: Primero verifica cuántos registros se obtienen de una consulta dada en el phpMyadmin (con los valores que usarás en la variable); luego realiza la consulta, pero haciendo que te muestre cuántos registros devuelve la query en el array que MySQL responde.
Si la cantidad de registros esperados y los efectivamente recibidos es iguale, el error está en la representación de la tabla.
Si la cantidad de registros es diferente, entonces está mal manejada la llamada a la base.
Lo que puedo asegurarte es que si los datos son esos, entonces la consulta está bien redactada.

¿Estás seguro que la consulta que nos estás mostrando es realmente la que se está haciendo?
¿No estarás haciendo un JOIN que no estás posteando?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 09/06/2012, 16:03
 
Fecha de Ingreso: mayo-2012
Mensajes: 7
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: Resultados duplicados al utilizar OR

gnzsoloyo , Ok voy a seguir tus consejos para ver donde está el problema, probablemente en el PHP que recibe la consulta.

tunait, se lo pedi de la siguiente manera:

Código MySQL:
Ver original
  1. mysql> SELECT DISTINCT id, app_date, from_user_id, to_user_id, credits
  2.     -> FROM credits
  3.     -> WHERE
  4.     ->     to_user_id = 2
  5.     ->     OR
  6.     ->     from_user_id = 2
  7.     -> ORDER BY id DESC;

Por lo visto no obtuve diferentes resultados por que la consulta esta bien y es la aplicación la que está duplicando los datos.

Deja investigo mas a fondo esto y expongo mis resultados. Saludos!
  #13 (permalink)  
Antiguo 09/06/2012, 16:07
 
Fecha de Ingreso: mayo-2012
Mensajes: 7
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: Resultados duplicados al utilizar OR

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Estás seguro que la consulta que nos estás mostrando es realmente la que se está haciendo?
¿No estarás haciendo un JOIN que no estás posteando?
La consulta es la que les estoy mostrando, solamente cambie la variable "$reseller_id" por numeros que representaran un ID para FROM_USER_ID y TO_USER_ID.

No estoy haciendo un JOIN en ningun lado.

Voy a revisar la aplicación a ver si encuentro donde esta el problema, por lo tanto ya estoy seguro de que la consulta esta bien.

Etiquetas: duplicados, php, resultados
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 22:30.