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.

Billynoah
fuente

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
truppo
fuente
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.
Tomalak
fuente
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

Aprendizaje
fuente
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
Jiri Fornous
fuente
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
Ivan
fuente
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