Ordenar una tabla MySQL por dos columnas


228

¿Cómo ordeno una tabla MySQL por dos columnas?

Lo que quiero son los artículos ordenados por las calificaciones más altas primero, luego la fecha más reciente. Como ejemplo, esto sería una salida de muestra (el número izquierdo es la calificación, luego el título del artículo, luego la fecha del artículo)

50 Este artículo es genial | 4 de febrero de 2009
35 Este artículo es bastante bueno | 1 de febrero de 2009
5 | Este artículo no es tan bueno | 25 de enero de 2009

El SQL relevante que estoy usando es:

ORDER BY article_rating, article_time DESC

Puedo ordenar por uno u otro, pero no por ambos.

Respuestas:


480

La clasificación predeterminada es ascendente, debe agregar la palabra clave DESC a ambos pedidos:

ORDER BY article_rating DESC, article_time DESC

Impar. Cuando tengo dos columnas, el nombre y el total y quiero ordenar alfabéticamente por nombre y DESC por total, entonces solo veo que se ordenó por nombre, pero no por total
Eugene

He estado hackeando con (-1) * campo1, campo2 sin ninguna razón en campos numéricos ... gracias.
Asad Hasan

jajaja .... no es una buena consulta, porque si lo intentas, nunca podrás reordenar la categoría de valores "vacíos" ... buen intento en 2009 ... pero en 2015 no funciona correctamente;), lo correcto es "3
Subconsulta

Dicha consulta no funciona en mi caso. En este caso, no obtengo la clasificación de Ciudad, seleccione Ciudad distinta, País de clientes ordenados por País desc, Ciudad desc;
Pra_A

44
No sé por qué esto se marca como respuesta, pero no lo es. Se ordena por la primera columna y luego por la segunda, pero no por las dos al mismo tiempo.
aidonsnous

34
ORDER BY article_rating, article_time DESC

se ordenará por article_time solo si hay dos artículos con la misma calificación. Por todo lo que puedo ver en su ejemplo, esto es exactamente lo que sucede.

 primary sort                         secondary sort 
1.  50 | This article rocks          | Feb 4, 2009    3.
2.  35 | This article is pretty good | Feb 1, 2009    2.
3.  5  | This Article isn't so hot   | Jan 25, 2009   1.

pero considere:

 primary sort                         secondary sort 
1.  50 | This article rocks          | Feb 2, 2009    3.
1.  50 | This article rocks, too     | Feb 4, 2009    4.
2.  35 | This article is pretty good | Feb 1, 2009    2.
3.  5  | This Article isn't so hot   | Jan 25, 2009   1.

Esta respuesta me ayudó. Gracias @Tomalak
Jayani Sumudini

12
ORDER BY article_rating ASC , article_time DESC

DESCal final se ordenarán por ambas columnas descendentes. Tienes que especificar ASCsi lo quieres de otra manera


8

Esto quizás ayude a alguien que está buscando la forma de ordenar la tabla por dos columnas, pero de manera paralela. Esto significa combinar dos tipos usando la función de clasificación agregada. Es muy útil cuando, por ejemplo, recupera artículos utilizando la búsqueda de texto completo y también en relación con la fecha de publicación del artículo.

Este es solo un ejemplo, pero si capta la idea, puede encontrar muchas funciones agregadas para usar. Incluso puede pesar las columnas para preferir una a la segunda. La función mía toma extremos de ambos tipos, por lo tanto, las filas más valoradas están en la parte superior.

Lo siento si existen soluciones más simples para hacer este trabajo, pero no he encontrado ninguna.

SELECT
 `id`,
 `text`,
 `date`
 FROM
   (
   SELECT
     k.`id`,
     k.`text`,
     k.`date`,
     k.`match_order_id`,
     @row := @row + 1 as `date_order_id`
     FROM
     (
       SELECT
         t.`id`,
         t.`text`,
         t.`date`,
         @row := @row + 1 as `match_order_id`
         FROM
         (
           SELECT
             `art_id` AS `id`,
             `text`   AS `text`,
             `date`   AS `date`,
             MATCH (`text`) AGAINST (:string) AS `match`
             FROM int_art_fulltext
             WHERE MATCH (`text`) AGAINST (:string IN BOOLEAN MODE)
             LIMIT 0,101
         ) t,
         (
           SELECT @row := 0
         ) r
         ORDER BY `match` DESC
     ) k,
     (
       SELECT @row := 0
     ) l
     ORDER BY k.`date` DESC
   ) s
 ORDER BY (1/`match_order_id`+1/`date_order_id`) DESC

34
Dios mío, ¿por qué publicas ese código para una pregunta tan simple?
Ben Sinclair

4

Lo siguiente ordenará sus datos dependiendo de ambas columnas en orden descendente.

ORDER BY article_rating DESC, article_time DESC

3
¿Cómo una copia de la respuesta aceptada 4 años después recibe esta cantidad de votos?
Stack Underflow

puede ser debido a una explicación: P
Rizwan Haider
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.