sql >> Database >  >> RDS >> Mysql

Tekenreeksen sorteren in MySQL

Waarschijnlijk zeer inefficiënt, maar zonder door de gebruiker gedefinieerde functies:

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

BEWERKEN

Ik moest een beter alternatief bedenken voordat ik naar bed ging, anders was ik nooit in slaap gevallen; dus hier is een veel schoner en efficiënter alternatief.

Ik heb een tabel gemaakt met de naam letters met een enkele kolom VARCHAR(1) met de naam letter, en vulde die tabel vervolgens met de letters A tot 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');

dan:

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`


  1. Wat is het equivalent van 'tabel beschrijven' in SQL Server?

  2. Alternatief voor veel booleans in MySQL?

  3. MySQL meerdere kolommen in IN-clausule

  4. MySQL-back-up- en herstelopdrachten voor databasebeheer