MySQL - ORDER BY valores dentro IN ()
-
12-09-2019 - |
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?
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