Ordene uma tabela MySQL por duas colunas


228

Como ordeno uma tabela MySQL por duas colunas?

O que eu quero são artigos classificados primeiro pelas classificações mais altas e depois pela data mais recente. Como exemplo, isso seria um exemplo de saída (o número da esquerda é a classificação, o título do artigo e a data do artigo)

50 Este artigo é demais | 4 Fev 2009
35 Este artigo é muito bom | 1 Fev 2009
5 Este artigo não é tão quente | 25 Jan 2009

O SQL relevante que estou usando é:

ORDER BY article_rating, article_time DESC

Eu posso classificar por um ou outro, mas não ambos.

Respostas:


480

A classificação padrão é crescente, você precisa adicionar a palavra-chave DESC nos seus pedidos:

ORDER BY article_rating DESC, article_time DESC

Ímpar. Quando eu tiver duas colunas, o nome eo totais e querem ordem alfabética por nome e DESC por total, então eu só vejo, que foi ordenado por nome, mas não pela Total
Eugene

Eu estive hackeando com (-1) * campo1, campo2 sem motivo em campos numéricos ... obrigado.
Asad Hasan

hahaha .... não é uma boa consulta, porque se você tentar, nunca poderá reordenar a categoria de valores "vazio" ... boa tentativa em 2009 .. mas em 2015 não funcionar corretamente;), o correto é "3 subconsulta "ou" 2 "
entregue em 04/02/16

Essa consulta não está funcionando no meu caso. Nesse caso, não recebo a classificação por Cidade, selecione Cidade distinta, País dos clientes, solicite por País desc, Cidade desc;
Pra_A 15/09/16

4
Não sei por que isso está marcado como resposta, mas não é. Classifica pela primeira coluna e depois pela segunda, mas não pelas duas ao mesmo tempo.
precisa saber é o seguinte

34
ORDER BY article_rating, article_time DESC

classificará por article_time apenas se houver dois artigos com a mesma classificação. Pelo que posso ver no seu exemplo, é exatamente isso que acontece.

 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.

mas 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 resposta ajudou a me.thanks @Tomalak
Jayani Sumudini

12
ORDER BY article_rating ASC , article_time DESC

DESCno final, as duas colunas serão ordenadas por ordem decrescente. Você deve especificar ASCse deseja o contrário


8

Isso talvez ajude alguém que está procurando a maneira de classificar a tabela por duas colunas, mas de maneira paralela. Isso significa combinar duas classificações usando a função de classificação agregada. É muito útil quando, por exemplo, recuperar artigos usando a pesquisa de texto completo e também sobre a data de publicação do artigo.

Este é apenas um exemplo, mas se você pegar a ideia, poderá encontrar muitas funções agregadas para usar. Você pode até ponderar as colunas para preferir uma sobre o segundo. A função minha leva a extremos de ambos os tipos, portanto, as linhas mais valorizadas estão no topo.

Desculpe se existem soluções mais simples para fazer esse trabalho, mas não encontrei nenhuma.

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
oh meu deus, por que você publica esse código para uma pergunta tão simples?
Ben Sinclair

4

A seguir, os dados serão solicitados, dependendo da coluna em ordem decrescente.

ORDER BY article_rating DESC, article_time DESC

3
Como uma cópia da resposta aceita, quatro anos depois, recebe tantos votos positivos?
Pilha Underflow

pode ser por causa da explicação: P
Rizwan Haider
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.