2011-11-04 8 views
5

Estoy tratando de obtener datos donde el orden no importa con identificadores únicos. Así que simplemente mi consulta seríaPHP mysql Distinto, solo carga 1 conjunto de identificadores

SELECT DISTINCT id1, id2 FROM messages ORDER BY date 

Si tengo una base de datos con los siguientes datos:

id1 | id2 | date 
5 | 6 | 1/2/2011 
6 | 5 | 1/1/2011 

que sólo se necesitaría para cargar la columna con la fecha más reciente, porque los identificadores son las mismas 2 personas . Realmente tengo que cargar las identificaciones donde uno de los IDS es la suya por lo que mi consulta verdadera en este momento es

SELECT DISTINCT userid_1, userid_2 
    FROM messages 
    WHERE userid_2=$dbid 
    OR userid_1=$dbid 
ORDER BY date 

y me sale un resultado como [6 5] [5 9] [9 5] [5 15] [5 6] [5 17]

Resultados 2 y 3 son los mismos y 1 y 5 lo mismo. Realmente solo se deben consultar 4 resultados. ¡Gracias!

Respuesta

2

Una opción es:

SELECT DISTINCT 
if(userid_1 >= userid_2,userid_1, userid_2) AS 'id1', 
if(userid_1 >= userid_2,userid_2, userid_1) AS 'id2' 

FROM messages 
WHERE userid_2=$dbid OR userid_1=$dbid ORDER BY date 
  1. Esta consulta muestra dos campos para cada registro.
  2. El primer campo se idusuario1 si es mayor o igual a UserID2, más va a mostrar UserID2
  3. El segundo campo tiene la lógica opuesta
  4. Esto asegura que dos conjuntos similares de resultados se alwas pedirse la misma manera, entonces el DISTINCT lo considerará igual.
+0

Por alguna razón, si lo hago, carga la cantidad correcta de filas, pero en realidad no obtendrá ningún dato. simplemente muestra [] [] [] [] que se supone que me muestra los ID que se están cargando. if ($ resultado> 0) { \t tiempo ($ fila = mysql_fetch_assoc ($ consulta)) { \t \t echo "[". $ Fila [ 'UserID_1']."". $ Fila [ 'userid_2' ]"]"; \t} } –

+0

nvm, olvidó que necesita poner el [if (userid_1> = userid_2, userid_1, userid_2)] entre corchetes. –

+0

Funciona perfecto, pero si no te importa puedes explicarme cómo funciona eso porque no estoy seguro de entenderlo. –

1

Si su objetivo es conseguir emparejamientos distintos, se puede hacer lo siguiente para obtener el más pequeño de la pareja siempre en la columna de la izquierda y la más grande en la derecha, asegurando de este modo que las obras distintas:

SELECT DISTINCT 
(id1 - ((id1 - id2) + abs(id1 - id2)) * .5) as first, 
(id2 + ((id1 - id2) + abs(id1 - id2)) * .5) as second 
FROM messages ORDER BY date; 

Dado que los pares siempre se organizan, no hay necesidad de funciones de emparejamiento.

Ejemplo

+------+------+--------+------------+ 
| id1 | id2 | val | pair_date | 
+------+------+--------+------------+ 
| 4 | 5 | test 1 | 2010-12-25 | 
| 5 | 4 | test 2 | 2011-10-31 | 
| 17 | 50 | test 3 | 2011-07-04 | 
| 50 | 17 | test 4 | 2001-01-01 | 
+------+------+--------+------------+ 

Si ejecuta esta consulta:

SELECT DISTINCT 
    (id1 - ((id1 - id2) + abs(id1 - id2)) * .5) AS first, 
    (id2 + ((id1 - id2) + abs(id1 - id2)) * .5) AS second 
    FROM pairs ORDER BY pair_date; 

me sale:

+-------+--------+ 
| first | second | 
+-------+--------+ 
| 4.0 | 5.0 | 
| 17.0 | 50.0 | 
+-------+--------+ 
2 rows in set (0.00 sec) 

Obviamente el uso de un valor lógico tiene el mismo efecto, es más fácil de leer, y probablemente sea más rápido, pero el algoritmo anterior es útil si solo necesitas cambiar dos números para que un lado sea siempre el menor.

No estoy seguro de por qué habría recibido un error. Estoy ejecutando mis pruebas directamente desde la línea de comandos de MySQL ....

+0

Gracias, ya lo tengo pero puse esto para ver si funcionó también e hizo que salga el error mysql_num_rows. No encontré el error porque ya estoy trabajando y tenía curiosidad si el suyo también funcionara. La forma en que terminé haciéndolo fue "SELECT DISTINCT if (userid_1> = userid_2, userid_1, userid_2), if (userid_1> = userid_2, userid_2, userid_1) FROM mensajes WHERE userid_2 = $ dbid O userid_1 = $ dbid ORDEN POR fecha DESC " –

+0

Definitivamente lo probé, porque sabía que era un poco raro. Hay muchos paréntesis que dejan lugar a la confusión ... Además, los valores se devuelven como dobles debido a la división entre 2. Lo otro es que en realidad no tengo un campo de fecha en mi prueba. No creo que eso deba importar. Añadiré algunos y publicaré mi prueba. – Anthony

+0

Gracias por probarlo y darme su opinión. Avíseme si alguna vez funciona o si es útil. – Anthony

Cuestiones relacionadas