Pergunta

Eu estou esperando para classificar os itens devolvidos na consulta a seguir por a ordem que eles estão inseridos na função IN () .

ENTRADA:

SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C');

SAÍDA:

|   id   |   name  |
^--------^---------^
|   5    |   B     |
|   6    |   B     |
|   1    |   D     |
|   15   |   E     |
|   17   |   E     |
|   9    |   C     |
|   18   |   C     |

Todas as idéias?

Foi útil?

Solução

SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')

O CAMPO função retorna a posição da primeira cadeia na lista restante de strings.

No entanto, é muito melhor em termos de performance para ter uma coluna indexada que representa a sua ordem de classificação e, em seguida, classificar por essa coluna.

Outras dicas

Outra opção a partir daqui: http://dev.mysql.com/doc/refman/5.0 /en/sorting-rows.html

select * 
from tablename 
order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;

Assim, no seu caso (não testado) seria

SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY name = 'B', name = 'A', name = 'D', name =  'E', name = 'C';

Dependendo o que você está fazendo eu achei um peculiar pouco, mas sempre tenho que trabalhar depois de jogar com ele um pouco.

Tente algo como

... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...

Pode ser isso pode ajudar alguém (p_CustomerId é passado SP):

SELECT CompanyAccountId, CompanyName
FROM account
LEFT JOIN customer where CompanyAccountId = customer.AccountId
GROUP BY CompanyAccountId
ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId 
                                          FROM customer
                                          WHERE customerid= p_CustomerId) 
                 THEN 0
                 ELSE 1
          END, CompanyName;

Descrição: Eu quero mostrar a lista de contas. Aqui eu estou passando uma ID de cliente em sp. Agora ele irá listar os nomes de conta com contas vinculadas ao que os clientes são mostrados no topo seguido por outras contas em ordem alfabética.

Você precisa de uma outra coluna (numérico), em sua mesa, em que você especificar a ordem de classificação. A cláusula IN não funciona desta forma.

B - 1
A - 2
D - 3
E - 4
C - 5

apenas uso

order by INSTR( ',B,C,D,A,' ,  concat(',' , `field`, ',' ) )

evitar a situação como

 INSTR('1,2,3,11' ,`field`) 

terminará com linha de resultado não-ordenada: 1 e 11 alternant

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