2009-02-05 39 views
156

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

Lo que quiero son artículos clasificados por las clasificaciones más altas primero, luego la más reciente. A modo de ejemplo, este sería un ejemplo de salida (a la izquierda # es la calificación, entonces el título del artículo, entonces 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 ambos.

Respuesta

340

clasificación por defecto es ascendente, es necesario agregar la palabra clave DESC tanto a sus órdenes:

ORDER BY article_rating DESC, article_time DESC 
+0

Odd. Cuando tengo dos columnas, el nombre y el total y quiero ordenar alfabéticamente por nombre y DESC por total, entonces solo veo, que fue ordenado por nombre, pero no por total – Eugene

+0

¡No sabía que fuera posible! Extenlent! :) – teecee

+0

He estado pirateando con (-1) * campo1, campo2 sin ninguna razón en los campos numéricos ... gracias. –

7
ORDER BY article_rating ASC , article_time DESC 

DESC al final va a clasificar por ambas columnas descendentes. Tiene que especificar ASC si quieres que de otro modo

20
ORDER BY article_rating, article_time DESC 

clasificará por article_time sólo si hay dos artículos con la misma calificación. De todo lo que puedo ver en tu 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 tenga en cuenta:

↓ 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. 
6

Esto tal vez ayudar a alguien que esté buscando la manera de ordenar la tabla por dos columnas, pero en forma paralela. Esto significa combinar dos géneros usando la función de clasificación agregada. Es muy útil cuando, por ejemplo, recupera artículos que utilizan 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 ponderar las columnas para preferir uno por segundo. La función mía toma extremos de ambos tipos, por lo tanto, las filas más valoradas están en la parte superior.

Disculpe si existen soluciones simplier para hacer este trabajo, pero no he encontrado ninguno.

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 
+18

oh, Dios mío, ¿por qué publicas ese código para una pregunta tan simple? – Andy

2

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

ORDER BY article_rating DESC, article_time DESC