Mysql
 sql >> база данни >  >> RDS >> Mysql

mysql избира динамични стойности на редове като имена на колони, друга колона като стойност

За разлика от някои други RDBMS MySQL няма вградена поддръжка за операции от този тип по дизайн (разработчиците смятат, че е по-подходящ за слоя на вашето приложение, а не за база данни).

Ако абсолютно трябва да извършвате такива манипулации в MySQL, изграждането на подготвено изявление е начинът, по който трябва да отидете – макар че вместо да се забърквате с CASE , вероятно просто бих използвал MySQL GROUP_CONCAT() функция:

SELECT CONCAT(
  'SELECT `table`.id', GROUP_CONCAT('
     ,    `t_', REPLACE(name, '`', '``'), '`.value
         AS `', REPLACE(name, '`', '``'), '`'
     SEPARATOR ''),
 ' FROM `table` ', GROUP_CONCAT('
     LEFT JOIN `table`   AS `t_', REPLACE(name, '`', '``'), '`
            ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id
           AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name)
     SEPARATOR ''),
 ' GROUP BY `table`.id'
) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t;

PREPARE stmt FROM @qry;
EXECUTE stmt;

Вижте го на sqlfiddle .

Обърнете внимание, че резултатът от GROUP_CONCAT() е ограничен от group_concat_max_len променлива (по подразбиране от 1024 байта:малко вероятно е да е от значение тук, освен ако нямате изключително дълго name стойности).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Доктрина 2 и таблица с връзки много към много с допълнително поле

  2. SQL Buddy – уеб базиран инструмент за администриране на MySQL

  3. Как да променя съпоставянето на база данни, таблица, колона?

  4. mysql_insert_id безопасен ли е за използване?

  5. CURRENT_TIMESTAMP Примери – MySQL