MySQL - Conditional ORDER BY
Come fare a scegliere il campo di ordinamento di un resultset in base al valore di un'altro campo?
MySQL ci viene in aiuto con il costrutto CASE ... WHEN ... THEN.
Per capire velocemente come funziona, vi riposto qui di seguito un semplice esempio. Partiamo con avere una tabella con la seguente struttura
--
-- Struttura della tabella `student`
--
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`position` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;
Popoliamo la tabella con i seguenti dati:
--
-- Dump dei dati per la tabella `student`
--
INSERT INTO `student` VALUES(11, 'Alice', 0);
INSERT INTO `student` VALUES(10, 'Roy', 0);
INSERT INTO `student` VALUES(9, 'Tim', 0);
INSERT INTO `student` VALUES(8, 'Bob', 0);
A questo punto vogliamo che l'ordinamento avvenga utilizzando il campo 'name' nel caso la colonna 'position' abbia tutti 0, altrimenti utilizzando il campo 'position'. Eseguendo la seguente query
SELECT * FROM student WHERE 1
ORDER BY
CASE position
WHEN 0 THEN name
ELSE position END;
id name position
11 Alice 0
8 Bob 0
10 Roy 0
9 Tim 0
Proviamo ora a modificare il campo 'position'
UPDATE student SET position = '4' WHERE id =11
UPDATE student SET position = '3' WHERE id =8;
UPDATE student SET position = '2' WHERE id =10;
UPDATE student SET position = '1' WHERE id =9;
Il risultato dell query questa volta sarà
id name position
9 Tim 1
10 Roy 2
8 Bob 3
11 Alice 4