Home / Database & Server / Database & Server / Ordinamento personalizzato in MySQL
Mattepuffo

Ordinamento personalizzato in MySQL

Ordinamento personalizzato in MySQL

Quello che mi serve è questo: ordinare i dati partendo da un record specifico, e poi a seguire tutti gli altri.

Ho scoperto che è abbastanza semplice usando la funzione INSTR.

Supponiamo di avere una serie di autori:

SELECT * FROM author ORDER BY author_id;
+-----------+--------------------------------------+
| author_id | author_name                          |
+-----------+--------------------------------------+
|         1 | mcclure, scambray, kurtz             |
|         2 | clive cussler                        |
|         3 | stephen king                         |
|         4 | cecchi paone                         |
|         5 | flem ath                             |
|         6 | nagel, evjen, glynn, watson, skinner |
|         8 | herman hesse                         |
|        10 | deitel - deitel                      |
|        11 | dave thau                            |
|        13 | cesare pavese                        |
+-----------+--------------------------------------+

Autori ordinati per id.

Supponiamo adesso che al primo posto voglio metterci clive cussler:

SELECT * FROM author ORDER BY INSTR('clive cussler', author_name) DESC;
+-----------+-------------------------------+
| author_id | author_name                   |
+-----------+-------------------------------+
|         2 | clive cussler                 |
|        80 | magnus lie hetland            |
|        61 | shakespeare                   |
|        60 | plauto                        |
|        59 | clive cussler, paul kemprecos |
|        58 | machiavelli                   |
|        57 | michael crichton              |
|        56 | moravia                       |
|        55 | jack london                   |
|        53 | arthur c. clarke              |
+-----------+-------------------------------+

Usato la funzione INSTR passando come primo parametro il valore da cercare, e come secondo il campo in cui cercare.

Attenzione alla clausola DESC, fondamentale se si vuole mettere il valore come primo; sennò l'ordine risulterà inverso.

Possiamo cercarne anche più di uno:

SELECT * FROM author ORDER BY INSTR('clive cussler plauto', author_name) DESC;
+-----------+-------------------------------+
| author_id | author_name                   |
+-----------+-------------------------------+
|        60 | plauto                        |
|         2 | clive cussler                 |
|        80 | magnus lie hetland            |
|        61 | shakespeare                   |
|        59 | clive cussler, paul kemprecos |
|        58 | machiavelli                   |
|        57 | michael crichton              |
|        56 | moravia                       |
|        55 | jack london                   |
|        53 | arthur c. clarke              |
+-----------+-------------------------------+

Vanno messi insieme sempre dentro al primo parametro.

Se volessimo cercare invece nel campo id (che è numerico):

SELECT * FROM author ORDER BY INSTR('2', author_id) DESC;
+-----------+-------------------------------+
| author_id | author_name                   |
+-----------+-------------------------------+
|         2 | clive cussler                 |
|        80 | magnus lie hetland            |
|        61 | shakespeare                   |
|        60 | plauto                        |
|        59 | clive cussler, paul kemprecos |
|        58 | machiavelli                   |
|        57 | michael crichton              |
|        56 | moravia                       |
|        55 | jack london                   |
|        53 | arthur c. clarke              |
+-----------+-------------------------------+

Il valore da ricercare va comunque tra virgolette.