Probablemente altamente ineficiente, pero sin necesidad de funciones definidas por el usuario:
SELECT GROUP_CONCAT(LETTER SEPARATOR '') AS ReOrderedLetters
FROM (SELECT 'A' as LETTER FROM <table> WHERE UPPER(`name`) like '%A%'
UNION ALL
SELECT 'B' as LETTER FROM <table> WHERE UPPER(`name`) like '%B%'
UNION ALL
SELECT 'C' as LETTER FROM <table> WHERE UPPER(`name`) like '%C%'
UNION ALL
SELECT 'D' as LETTER FROM <table> WHERE UPPER(`name`) like '%D%'
...
UNION ALL
SELECT 'Y' as LETTER FROM <table> WHERE UPPER(`name`) like '%Y%'
UNION ALL
SELECT 'Z' as LETTER FROM <table> WHERE UPPER(`name`) like '%Z%'
) alpha
EDITAR
que tenía que llegar a una mejor alternativa antes de ir a la cama, de lo contrario estaría nunca he llegado a dormir; entonces aquí hay una alternativa mucho más limpia y eficiente.
he creado una tabla llamada letras con una sola columna de VARCHAR (1) llamada carta; luego se llena la mesa con las letras A a Z
CREATE TABLE IF NOT EXISTS `letters` (
`letter` varchar(1) NOT NULL,
PRIMARY KEY (`letter`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `letters` (`letter`) VALUES
('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),
('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z');
a continuación:
select U.`name`,
GROUP_CONCAT(L.`letter`
ORDER BY L.`letter` ASC
SEPARATOR '') AS ReOrderedLetters
FROM `users` U
LEFT JOIN `letters` L ON POSITION(L.`letter` IN UPPER(U.`name`)) > 0
GROUP BY U.`name`
¿Cómo quieres duplicados tratados? "libro" -> "bko" o "bkoo"? Por interés, ¿por qué necesitas hacer esto? –
¿Es sensible a las mayúsculas o minúsculas? –
no entre mayúsculas y minúsculas –