Domanda

È possibile eseguire un'istruzione SELECT con un ordine predeterminato, ad es. selezionando gli ID 7,2,5,9 e 8 e restituendoli in quell'ordine , in base a nient'altro che il campo ID?

Istruzioni SELECT id FROM table WHERE id in (7,2,5,9,8); e SELEZIONA ID DA tabella DOVE id in (8,2,5,9,7); entrambi li restituiscono nello stesso ordine.

È stato utile?

Soluzione

Non pensavo fosse possibile, ma ho trovato un post di blog qui che sembra per fare il tipo di cosa che stai cercando:

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

darà risultati diversi a

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 restituisce la posizione di id nel secondo argomento fornito, quindi per il primo caso precedente, id di 7 è nella posizione 1 dell'insieme , 2 a 2 e così via - mysql risolve internamente qualcosa come

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

quindi ordina in base ai risultati di FIND_IN_SET .

Altri suggerimenti

ORDER BY FIELD (ID, 7,2,4,5,8) è la soluzione migliore, ma è ancora brutta.

Potresti includere un'espressione case che associa i tuoi ID 7,2,5, ... agli ordinali 1,2,3, ... e quindi ordinare in base a quell'espressione?

Tutto l'ordinamento viene eseguito dalle parole chiave ORDER BY, ma puoi solo ordinare in ordine crescente o decrescente. Se stai usando un linguaggio come PHP, puoi ordinarli di conseguenza usando un po 'di codice ma non credo sia possibile solo con MySQL.

Funziona in Oracle. Puoi fare qualcosa di simile in 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

Potrebbe essere necessario creare una tabella temporanea con un campo autonumber e inserirla nell'ordine desiderato. Quindi ordina sul nuovo campo autonumber.

Ehm, non proprio. Il più vicino che puoi ottenere è probabilmente:

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

Ma probabilmente non lo vuoi :)

È difficile darti consigli più specifici senza ulteriori informazioni su cosa c'è nelle tabelle.

È confuso (e probabilmente lento), ma puoi ottenere l'effetto con 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;

Modifica: altre persone hanno menzionato la funzione find_in_set che è documentata qui .

Ricevi rapidamente risposte qui, vero ...

Il motivo per cui lo sto chiedendo è che è l'unico modo a cui riesco a pensare di evitare di ordinare un complesso array multidimensionale. Non sto dicendo che sarebbe difficile ordinare, ma se ci fosse un modo più semplice per farlo con sql dritto, allora perché no.

Una soluzione 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);

Questo assegna un numero d'ordine a ciascun ID. Funziona bene con un piccolo set di valori.

La cosa migliore che mi viene in mente è l'aggiunta di una seconda colonna OrderColumn:

7 1
2 2
5 3
9 4 
8 5

E poi esegui un ORDER BY orderColumn

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top