Tags: order by
Ordenar los resultados de consulta
By admin on Jun 3, 2008 | In Aprendiz | Send feedback »
Aquí quiero mirar algunas maneras diferentes de clasificar filas, y lo haré mirando los registros de esta tabla ORDERS (por este ejemplo vamos a tener solamente algunas filas)
| location | amount | ord_date | order_id |
+-----------+--------+------------+----------+
| EUROPE | 5200 | 2008-03-03 | 500 |
| EUROPE | 2000 | 2008-02-21 | 450 |
| EUROPE | 13000 | 2008-04-02 | 502 |
| JAPAN | 20000 | 2008-04-03 | 503 |
| JAPAN | 13000 | 2008-05-05 | 506 |
| AMERICA | 13700 | 2008-05-29 | 507 |
| AMERICA | 10300 | 2008-02-05 | 220 |
| AUSTRALIA | 18743 | 2008-03-18 | 270 |
| AUSTRALIA | 40000 | 2008-06-02 | 700 |
| EUROPE | 35000 | 2008-06-02 | 702 |
Ahora sabes probablemente que podemos hacer ORDER BY normalmente por un campo location (en el modo ascendente del defecto, o usando la palabra clave DESC para) o por un de los otros campos (puedes ordenar de hecho por muchos campos en la misma declaración). Puedes también añadir las WHERE cláusulas antes de la ORDEN POR cláusula, de modo que realice tu ordenación en un subgrupo. ¿Pero, en este ejemplo, suponga que quieres primero, las filas órdenes de América y de Japón y después demostrar por la cantidad/amount que desciende? Puedes hacer esto por la declaración selecta siguiente:
Code:
SELECT location, amount, YEAR(ord_date) AS year, | |
MONTH(ord_date) , order_id | |
FROM ORDERS | |
ORDER BY | |
field(location, 'JAPAN', 'AMERICA') desc, amount desc; |
| location | amount | year | month | order_id |
+-----------+--------+------+-------+----------+
| AMERICA | 13700 | 2008 | 5 | 507 |
| AMERICA | 10300 | 2008 | 2 | 220 |
| JAPAN | 20000 | 2008 | 4 | 503 |
| JAPAN | 13000 | 2008 | 5 | 506 |
| AUSTRALIA | 40000 | 2008 | 6 | 700 |
| EUROPE | 35000 | 2008 | 6 | 702 |
| AUSTRALIA | 18743 | 2008 | 3 | 270 |
| EUROPE | 13000 | 2008 | 4 | 502 |
| EUROPE | 5200 | 2008 | 3 | 500 |
| EUROPE | 2000 | 2008 | 2 | 450 |
Note que también cambié el formato del campo del ord_date un poco, a los meses y a los años de la exhibición. Voy a cambiar el formato un poco más:- quiero exhibir los meses en español en vez de números del mes. Hago esto por medio de la función del CASO:
Code:
SELECT location, amount, | |
CASE when month(ord_date) = 1 then "enero" | |
when month(ord_date) = 2 then "febrero" | |
when month(ord_date) = 3 then "Marzo" | |
when month(ord_date) = 4 then "Abril" | |
when month(ord_date) = 5 then "Mayo" | |
ELSE "despues de Mayo" END AS trumonth, | |
YEAR(ord_date) AS year, | |
order_id | |
FROM ORDERS | |
ORDER BY | |
field(location, 'JAPAN', 'AMERICA') desc, amount desc; |
| location | amount | trumonth | year | order_id |
+-----------+--------+-----------------+------+----------+
| AMERICA | 13700 | Mayo | 2008 | 507 |
| AMERICA | 10300 | febrero | 2008 | 220 |
| JAPAN | 20000 | Abril | 2008 | 503 |
| JAPAN | 13000 | Mayo | 2008 | 506 |
| AUSTRALIA | 40000 | despues de Mayo | 2008 | 700 |
| EUROPE | 35000 | despues de Mayo | 2008 | 702 |
| AUSTRALIA | 18743 | Marzo | 2008 | 270 |
| EUROPE | 13000 | Abril | 2008 | 502 |
| EUROPE | 5200 | Marzo | 2008 | 500 |
| EUROPE | 2000 | febrero | 2008 | 450 |
Ahora (y aquí está la parte lista) puedes utilizar las funciones realizadas en campos dentro de la ORDER BY cláusula (declaración de CASO incluyendo). ¿Imagínese para querer mirar las figuras de mayo y de poste-Mayo primero, y después veas las figuras anteriores en orden del campo location?
Code:
SELECT location, amount, | |
MONTH(ord_date) truemonth, | |
YEAR(ord_date) AS year, | |
order_id | |
FROM ORDERS | |
ORDER BY | |
CASE when month(ord_date) > 5 then 1 | |
when month(ord_date) = 5 then 1 | |
ELSE 2 END, | |
location, | |
amount desc; |
| location | amount | truemonth | year | order_id |
+-----------+--------+-----------+------+----------+
| AMERICA | 13700 | 5 | 2008 | 507 |
| AUSTRALIA | 40000 | 6 | 2008 | 700 |
| EUROPE | 35000 | 6 | 2008 | 702 |
| JAPAN | 13000 | 5 | 2008 | 506 |
| AMERICA | 10300 | 2 | 2008 | 220 |
| AUSTRALIA | 18743 | 3 | 2008 | 270 |
| EUROPE | 13000 | 4 | 2008 | 502 |
| EUROPE | 5200 | 3 | 2008 | 500 |
| EUROPE | 2000 | 2 | 2008 | 450 |
| JAPAN | 20000 | 4 | 2008 | 503 |
Puedes ver que se puede ordenar en los resultados de una función (o de la función jerarquizada) realizada en un campo. Aquí está una manera útil de traer detrás clases al azar de una tabla (traeremos detrás apenas 5 filas por medio de la palabra clave del LIMIT)
Code:
[/codeblock]SELECT location, amount, order_id | |
FROM ORDERS | |
ORDER BY rand() limit 5; |
Hay algo que debes ser consciente de al actualizar la ordenación:- los valores nulos (NULL) pueden producir diversos resultados a lo que esperas. Dedicaré una entrada posterior en mi blog a tratar de los NULLs.