Ordem Mysql por valores de ID específicos


95

É possível classificar no mysql por "ordenar por" usando um conjunto predefinido de valores de coluna (ID) como: ordenar por (ID = 1,5,4,3) então eu obteria o registro 1, 5, 4, 3 naquele encomendar fora?

ATUALIZAÇÃO: Sobre abusar do mysql ;-) Tenho que explicar porque preciso disso ...

Quero que meus registros sejam classificados aleatoriamente a cada 5 minutos. Eu tenho uma tarefa cron para fazer a tabela de atualização para colocar uma ordem de classificação diferente e aleatória nela. Só existe um problema! PAGINAÇÃO. Terei um visitante que chega à minha página e darei a ele os primeiros 20 resultados. Ele esperará 6 minutos e irá para a página 2 e terá resultados errados porque a ordem de classificação já foi alterada.

Então pensei que se ele vier ao meu site eu coloco todos os ID's em uma sessão e quando ele está na página 2 ele pega os registros corretos mesmo que a classificação já tenha mudado.

Existe alguma outra maneira melhor de fazer isso?


Você está perguntando se há uma maneira de o mysql solicitar em nenhuma ordem específica?
stefgosselin

1
Parece que seu modelo de dados está quebrado / incompleto (de onde vem esse pedido?) Ou, alternativamente, você está abusando do MySQL.
derobert

Respostas:


202

Você pode usar a função ORDER BY e FIELD. Consulte http://lists.mysql.com/mysql/209784

SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)

Ele usa a função Field () , que "Retorna o índice (posição) de str na lista str1, str2, str3, .... Retorna 0 se str não for encontrado" de acordo com a documentação. Então, na verdade, você classifica o conjunto de resultados pelo valor de retorno desta função, que é o índice do valor do campo no conjunto fornecido.


Não consigo fazer isso funcionar sem usar também: WHERE ID IN (1,5,4,3)
TV-C-15

como você usaria isso com nenhum valor?
Nono Londres,

30

Você deve ser capaz de usar CASEpara isso:

ORDER BY CASE id
  WHEN 1 THEN 1
  WHEN 5 THEN 2
  WHEN 4 THEN 3
  WHEN 3 THEN 4
  ELSE 5
END

18

Na documentação oficial do mysql sobre ORDER BY , alguém postou que você pode usar FIELDpara este assunto, como este:

SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)

Este é um código não testado que em teoria deveria funcionar.


7
SELECT * FROM table ORDER BY id='8' DESC, id='5' DESC, id='4' DESC, id='3' DESC

Se eu tivesse 10 registros por exemplo, desta forma os ID 1, 5, 4 e 3 aparecerão primeiro, os demais registros aparecerão em seguida.

Exibição normal 1 2 3 4 5 6 7 8 9 10

Com este caminho

8 5 4 3 1 2 6 7 9 10


Ok Obrigado pelo conselho
Bruno Mangini Alves

6

Existe outra maneira de resolver isso. Adicione uma tabela separada, mais ou menos assim:

CREATE TABLE `new_order` (
  `my_order` BIGINT(20) UNSIGNED NOT NULL,
  `my_number` BIGINT(20) NOT NULL,
  PRIMARY KEY (`my_order`),
  UNIQUE KEY `my_number` (`my_number`)
) ENGINE=INNODB;

Esta tabela agora será usada para definir seu próprio mecanismo de pedido.

Adicione seus valores lá:

my_order | my_number
---------+----------
       1 |         1
       2 |         5
       3 |         4
       4 |         3

... e, em seguida, modifique sua instrução SQL ao ingressar nesta nova tabela.

SELECT *
FROM your_table AS T1
INNER JOIN new_order AS T2 on T1.id = T2.my_number
WHERE ....whatever...
ORDER BY T2.my_order; 

Esta solução é um pouco mais complexa do que outras soluções, mas usando-a, você não precisa alterar sua SELECTinstrução sempre que seus critérios de pedido mudarem - apenas altere os dados na tabela de pedidos.


0
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC

2
Você pode explicar isso melhor? Parece semelhante à resposta aceita, mas não acho que ASC OR DESCseja a sintaxe adequada
Nico Haase

@NicoHaase a diferença entre ASC e DESC é que se você usar asc então os ids que você usa na função de campo virão no final e se você usar DESC, então os ids na função de campo virão primeiro
Hisham shahid

@NicoHaase, você pode usar ASC ou DESC com a consulta que corresponda ao requisito
Hisham shahid

Portanto, você não pode usar os dois em uma consulta. Acho que Nico estava sugerindo que você respondesse sintaticamente correto. Tenho certeza de que ele está familiarizado com o que ASD e DESC realmente significam :)
RiggsFolly

0

Se você precisar solicitar um único id primeiro no resultado, use o id.

select id,name 
from products
order by case when id=5 then -1 else id end

Se você precisar começar com uma sequência de vários ids, especifique uma coleção, semelhante ao que você usaria com uma INinstrução.

select id,name 
from products
order by case when id in (30,20,10) then -1 else id end,id

Adicione mais descrições
Mathews Sunny

se você quiser usar ordenar por apenas para um id, use a 1ª consulta e se quiser vários ids, use a 2ª consulta
Rajesh Kharatmol

0

Se você quiser ordenar um único id por último no resultado, use a ordem por maiúsculas e minúsculas. (Ex .: você deseja "outra" opção na última e todas as listas de cidades aparecem em ordem alfabética.)

select id,city 
from city
order by case 
when id = 2 then city else -1 
end, city ASC

Se eu tivesse 5 cidades, por exemplo, eu quero mostrar a cidade em ordem alfabética com a opção "outra" exibida por último na lista suspensa, então podemos usar esta consulta. veja o exemplo que outros estão mostrando na minha tabela no segundo id (id: 2), então estou usando "quando id = 2" na consulta acima.

registro na tabela DB:

Bangalore - id:1
Other     - id:2
Mumbai    - id:3
Pune      - id:4
Ambala    - id:5

minha saída:

Ambala  
Bangalore  
Mumbai  
Pune
Other

2
Tente adicionar alguma explicação ao seu código, isso tornará sua resposta mais clara e compreensível. Leia stackoverflow.com/help/how-to-answer
32cupo

se você quiser usar ordenar por apenas para um id (Ex: você quer a opção "outro" no último e toda a lista de cidades mostrada em ordem alfabética.) então você pode usar esta consulta. está funcionando para mim.
Preeti
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.