Pergunta

É possível fazer uma instrução SELECT com uma ordem predeterminada, ie. selecionando IDs 7,2,5,9 e 8 e devolvê-los nessa ordem , com base em nada mais do que o campo ID?

instruções SELECT id FROM tabela WHERE id in (7,2,5,9,8); e SELECT id FROM tabela WHERE id in (8,2,5,9,7); tanto devolvê-los na mesma ordem.

Foi útil?

Solução

Eu não acho que isso era possível, mas encontrou uma href="http://www.handgestrickt.biz/item/21/" rel="noreferrer"> entrada que parece para fazer o tipo de coisa que você está depois:

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY FIND_IN_SET(id,"7,2,5,9,8");

vai dar resultados diferentes para

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY FIND_IN_SET(id,"8,2,5,9,7");

FIND_IN_SET retorna a posição de id no segundo argumento que lhe é dado, portanto, para o primeiro caso acima, id de 7 está na posição 1 no conjunto, 2 a 2 e assim por diante - mysql trabalha internamente algo como

id | FIND_IN_SET
---|-----------
7  | 1
2  | 2
5  | 3

então ordens pelos resultados de FIND_IN_SET.

Outras dicas

ORDER BY FIELD (ID, 7,2,4,5,8) é sua melhor aposta, mas ainda é feio.

Você pode incluir uma expressão caso que mapeia seus IDs 7,2,5, ... para os ordinais 1,2,3, ... e, em seguida, a fim de que a expressão?

Todos ordenação é feita pelo ORDER BY palavras-chave, você só pode no entanto classificar em ordem crescente e decrescente. Se você estiver usando uma linguagem como PHP você pode então classificar-los em conformidade com algum código, mas eu não acredito que é possível com o MySQL sozinho.

Isso funciona em Oracle. você pode fazer algo semelhante no MySql?

SELECT ID_FIELD
FROM SOME_TABLE
WHERE ID_FIELD IN(11,10,14,12,13)
ORDER BY
  CASE WHEN ID_FIELD = 11 THEN 0
       WHEN ID_FIELD = 10 THEN 1
       WHEN ID_FIELD = 14 THEN 2
       WHEN ID_FIELD = 12 THEN 3
       WHEN ID_FIELD = 13 THEN 4
  END

Você pode precisar criar uma tabela temporária com um campo de numeração automática e inserir-lo na ordem desejada. Em seguida, classificar o novo campo AutoNumeração.

Erm, não realmente. Mais próximo que você pode obter é provavelmente:

SELECT * FROM table WHERE id IN (3, 2, 1, 4) ORDER BY id=4, id=1, id=2, id=3

Mas você provavelmente não quer que:)

É difícil dar-lhe algum conselho mais específico, sem mais informações sobre o que está nas tabelas.

É hacky (e provavelmente lenta), mas você pode obter o efeito com UNION ALL:

SELECT id FROM table WHERE id = 7
UNION ALL SELECT id FROM table WHERE id = 2
UNION ALL SELECT id FROM table WHERE id = 5
UNION ALL SELECT id FROM table WHERE id = 9
UNION ALL SELECT id FROM table WHERE id = 8;

Editar: Outras pessoas mencionado a função FIND_IN_SET que está documentado aqui .

Você obter respostas rápidas por aqui, não é ...

A razão que eu estou fazendo esta é que é a única maneira que eu posso pensar para evitar ordenação de um array multidimensional complexa. Eu não estou dizendo que seria difícil de classificar, mas se houvesse uma maneira mais simples de fazê-lo com o SQL reta, então por que não.

solução Um Oracle é:

SELECT id FROM table WHERE id in (7,2,5,9,8)
ORDER BY DECODE(id,7,1,2,2,5,3,9,4,8,5,6);

Isso atribui um número para cada ID. Funciona bem para um pequeno conjunto de valores.

Melhor que posso pensar é a adição de um segundo orderColumn Coluna:

7 1
2 2
5 3
9 4 
8 5

E, em seguida, basta fazer uma ORDER BY orderColumn

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top