2011-09-16 29 views
5

Tengo una tabla con varias filas que tienen los mismos datos. Usé SELECT DISTINCT para obtener una fila única y funciona bien. Pero cuando uso ORDER BY con SELECT DISTINCT me da datos sin clasificar.¿Cómo funciona SELECT DISTINCT en MySQL?

¿Alguien puede decirme cómo funciona distinto?

Según el criterio que selecciona la fila?

+0

¿Cuáles son las consultas que está intentando ejecutar? – srivani

+0

@srivani: Seleccione la identificación distinta de la tabla donde id2 = 12312 ordena por tiempo desc. – insomiac

+0

Sé que es demasiado tarde pero todavía no hay una respuesta aceptada, por lo que quiero saber si el OP todavía quiere responder por algo que no está cubierto en las respuestas dadas. –

Respuesta

1

Cuando especifica SELECT DISTINCT le dará todas las filas, eliminando los duplicados del conjunto de resultados. Por "duplicados" quiero decir filas donde todos los campos tienen los mismos valores. Por ejemplo, supongamos que tiene una tabla que se parece a:

id | num 
-------------- 
1 | 1 
2 | 3 
3 | 3 

SELECT DISTINCT * sería devolver todas las filas más arriba, mientras que SELECT DISTINCT num devolvería dos filas:

num 
----- 
1 
3 

nota de que la fila fila real (por ejemplo: si es la fila 2 o la fila 3) que selecciona es irrelevante, ya que el resultado sería indistinguible.

Por último, DISTINCT debería no afecta cómo funciona ORDER BY.

Referencia: MySQL SELECT statement

+2

Parece que sí lo hace en MYSQL. Lea esto: http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html – Icarus

+0

es casi como un error :) – Randy

+0

@Icarus Las optimizaciones que realiza son irrelevantes, siempre que el conjunto de resultados regresa como lo esperabas. – NullUserException

2

Desde su comentario anterior, la consulta que se está intentando ejecutar es

Select distinct id from table where id2 =12312 order by time desc. 

Como esperaba, aquí es su problema. Su columna de selección y orden por columna son diferentes. Sus filas de salida están ordenadas por tiempo, pero ese orden no necesariamente debe conservarse en la columna de id. Aquí hay un ejemplo.

id | id2 | time 
------------------- 
1 | 12312 | 34 
2 | 12312 | 12 
3 | 12312 | 48 

Si ejecuta

SELECT * FROM table WHERE id2=12312 ORDER BY time DESC 

que obtendrá el siguiente resultado

id | id2 | time 
------------------- 
2 | 12312 | 12 
1 | 12312 | 34 
3 | 12312 | 48 

Ahora bien, si sólo selecciona la columna id de esto, obtendrá

id 
-- 
2 
1 
3 

Es por eso que sus resultados son no ordenado

+0

¿Qué sucede si tienes varios identificadores (por ejemplo: id = 2 e id = 1 ocurrieron varias veces) cuál seleccionará haciendo desc por tiempo? – insomiac

+0

Si ejecuta "Seleccionar identificación distinta de la tabla donde id2 = 12312 ordenar por tiempo desc", los duplicados se eliminarán. Si ejecuta "Seleccionar id de la tabla donde id2 = 12312 ordenar por tiempo desc", los resultados contendrán duplicados. Entonces todas las ocurrencias de identificación serán devueltas. – srivani

+0

gracias por responder, Por ejemplo, si quiero obtener identificaciones recientes por tiempo y si estoy haciendo desc en tiempo con identificación distinta. No funciona con mysql. ¿Sabes cómo funciona distinto con el orden? – insomiac

0

El comportamiento que describe ocurre cuando ORDER BY una expresión que no está presente en la cláusula SELECT. El estándar SQL no permite dicha consulta, pero MySQL es menos estricto y lo permite.

Vamos a probar un ejemplo:

SELECT DISTINCT colum1, column2 
FROM table1 
WHERE ... 
ORDER BY column3 

Digamos que el contenido de la tabla table1 es:

id | column1 | column2 | column3 
----+---------+---------+--------- 
    1 | A  | B  | 1 
    2 | A  | B  | 5 
    3 | X  | Y  | 3 

Sin la cláusula ORDER BY, los anteriores devuelve la consulta siguientes dos registros (sin ORDER BY el orden no está garantizado):

column1 | column2 
---------+--------- 
A  | B 
X  | Y 

Pero con ORDER BY column3, la orden tampoco está garantizada.

La cláusula DISTINCT opera sobre los valores de las expresiones presentes en la cláusula SELECT. Si la fila n. ° 1 se procesa primero, entonces (A, B) se coloca en el conjunto de resultados y se asocia con la fila n. ° 1. Luego, cuando se procesa la fila # 2, los valores de las expresiones SELECT producen el registro (A, B) que ya está en el conjunto de resultados. Debido a DISTINCT se cae. La fila 3 produce (X, Y) que también se coloca en el conjunto de resultados. A continuación, la cláusula ORDER BY column3 hace que los registros se ordenen en el conjunto de resultados como (A, B), (X, Y).

Pero si fila # 2 se procesa antes de fila # 1 entonces, siguiendo la misma lógica expuesto en el párrafo anterior, los registros en el conjunto de resultados se ordenan como (X, Y), (A, B).

No hay ninguna regla impuesta en el motor de base de datos sobre el orden en que procesa las filas cuando ejecuta una consulta. La base de datos puede procesar las filas en cualquier orden que considere mejor para el rendimiento.

Su consulta es SQL no válido y el hecho de que puede devolver resultados diferentes utilizando los mismos datos de entrada lo demuestra.

Cuestiones relacionadas