PHP MySQL Ordenar por Dos columnas


¿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 (left # es la calificación, luego el título del artículo, luego la fecha del artículo)

50 | This article rocks          | Feb 4, 2009
35 | This article is pretty good | Feb 1, 2009
5  | This Article isn't so hot   | Jan 25, 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.

Author: Eric Leschinski, 2009-02-05

5 answers

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

ORDER BY article_rating DESC, article_time DESC
 382
Author: truppo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-05 07:51:35
ORDER BY article_rating, article_time DESC

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.
 23
Author: Tomalak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-05 07:55:05
ORDER BY article_rating ASC , article_time DESC

DESC al final se ordenará por ambas columnas descendentes. Tienes que especificar ASC si lo quieres de otra manera

 9
Author: Learning,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-21 10:19:24

Esto puede ayudar a alguien que está buscando la manera 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, se recuperan 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 captas la idea puedes encontrar muchas funciones agregadas para usar. Incluso puede ponderar las columnas para preferir una sobre la segunda. La función de la mía toma extremos de ambos tipos, por lo que 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
 7
Author: Jiri Fornous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-20 09:19:12

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

ORDER BY article_rating DESC, article_time DESC
 3
Author: Ivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-14 19:21:35