Eu estou querendo saber se existe uma distância (possivelmente uma maneira melhor) para ordenar pela ordem dos valores em uma cláusula IN ().
O problema é que tenho duas consultas, uma que obtém todos os IDs e a segunda que recupera todas as informações. O primeiro cria a ordem dos IDs pelos quais quero que o segundo seja ordenado. Os IDs são colocados em uma cláusula IN () na ordem correta.
Então seria algo como (extremamente simplificado):
SELECT id FROM table1 WHERE ... ORDER BY display_order, name
SELECT name, description, ... WHERE id IN ([id's from first])
O problema é que a segunda consulta não retorna os resultados na mesma ordem em que os IDs são colocados na cláusula IN ().
Uma solução que encontrei é colocar todos os IDs em uma tabela temporária com um campo de incremento automático, que é então associado à segunda consulta.
Existe uma opção melhor?
Nota: Como a primeira consulta é executada "pelo usuário" e a segunda é executada em um processo em segundo plano, não há como combinar a consulta 2 em 1 usando subconsultas.
Estou usando o MySQL, mas acho que pode ser útil anotar quais opções existem para outros bancos de dados também.
fonte
IN
eFIELD
parâmetros são iguais. Fazer isso em um código de programa pode ser mais rápido usando esse conhecimento adicional. Obviamente, pode ser mais sensato colocar essa carga no cliente, e não no servidor, se você tiver em mente o desempenho do servidor.sqlite
?Veja a seguir como obter dados classificados.
fonte
Duas soluções que vêm à mente:
order by case id when 123 then 1 when 456 then 2 else null end asc
order by instr(','||id||',',',123,456,') asc
(
instr()
É da Oracle, talvez você temlocate()
oucharindex()
ou algo parecido)fonte
Ans para obter dados classificados.
fonte
Se você deseja fazer uma classificação arbitrária em uma consulta usando valores inseridos pela consulta no MS SQL Server 2008+ , isso pode ser feito criando uma tabela rapidamente e fazendo uma junção assim (usando a nomenclatura do OP).
Se você substituir a instrução VALUES por outra coisa que faça a mesma coisa, mas no ANSI SQL, isso funcionará em qualquer banco de dados SQL.
Nota: A segunda coluna na tabela criada (orderTbl.orderIdx) é necessária ao consultar conjuntos de registros maiores que 100 ou mais. Originalmente, não tinha uma coluna orderIdx, mas descobri que, com conjuntos de resultados maiores que 100, era necessário classificar explicitamente por essa coluna; de qualquer maneira no SQL Server Express 2014.
fonte
orderTbl.orderKey
,orderTbl.orderIndex
pororderKey
,orderIndex
funcionou muito bem
fonte
A cláusula IN descreve um conjunto de valores e os conjuntos não têm ordem.
Sua solução com uma junção e, em seguida, solicitar na
display_order
coluna é a solução mais quase correta; qualquer outra coisa é provavelmente um hack específico do DBMS (ou está fazendo algumas coisas com as funções OLAP no SQL padrão). Certamente, a junção é a solução mais quase portátil (embora a geração de dados com osdisplay_order
valores possa ser problemática). Observe que pode ser necessário selecionar as colunas de pedidos; isso costumava ser um requisito no SQL padrão, embora eu acredite que ele tenha sido relaxado há algum tempo (talvez até o SQL-92).fonte
Para Oracle, a solução de John usando a função instr () funciona. Aqui está uma solução ligeiramente diferente que funcionou -
SELECT id FROM table1 WHERE id IN (1, 20, 45, 60) ORDER BY instr('1, 20, 45, 60', id)
fonte
Use a função MySQL FIND_IN_SET :
fonte
Eu apenas tentei fazer isso é o MS SQL Server, onde não temos FIELD ():
Note que também estou permitindo duplicação.
fonte
Meu primeiro pensamento foi escrever uma única consulta, mas você disse que isso não era possível porque uma é executada pelo usuário e a outra é executada em segundo plano. Como você está armazenando a lista de IDs a serem transmitidos do usuário para o processo em segundo plano? Por que não colocá-los em uma tabela temporária com uma coluna para indicar o pedido.
Então, e quanto a isso:
fonte
Eu acho que você deve conseguir armazenar seus dados de uma maneira que você simplesmente faça uma junção e será perfeito, para que não ocorram hacks e coisas complicadas.
Eu tenho, por exemplo, uma lista de "IDs de faixas" reproduzidas recentemente, no SQLite eu simplesmente faço:
fonte
Faça uma tentativa:
Provavelmente, as WHEREs precisarão de alguns ajustes para que as subconsultas correlacionadas funcionem corretamente, mas o princípio básico deve ser sólido.
fonte