2014-11-21 2 views
1

Недавно я наткнулся на проект со следующей структуройMysql значение динамического ряда, имена столбцов

http://sqlfiddle.com/#!2/3a4cf/1

все работает нормально, я думаю, что я могу сортировать вещи на PHP конце, но мой вопрос, это можно с помощью одного запроса

number, name, age, email, gender 
-------------------------------------------- 
123456, Test1, 24, [email protected], m 
123457, Test2, 23, [email protected], f 
123458, Test3, 22, [email protected], m 
123459, Test4, 21, [email protected], f 
123460, Test5, 25, [email protected], m 

рассматривает имена столбцов быть фактическим field.field_name

Я попытался остроумие h несколько левых/правых присоединяется (столько же полей, сколько и число), но может доходить до бесконечности lol ... т.е. иметь 100 полей, которые будут 200 объединений, чтобы получить результат в одной строке (все еще без имен столбцов, поле_значение).

Я посмотрел на следующие (возможно дубликата):.

mysql select dynamic row values as column names, another column as value

но много не суммируется и не говорить со мной (не то, что испытал в MySQL :()

Если возможно я бы признательна, если кто-нибудь может направлять мне немного о том, как достичь этого.

Спасибо заранее.

ответ

1

Я думаю, что вы хотите Тхи s запрос

SELECT SQL_NO_CACHE 
    n.number, n.name, 
MAX(CASE WHEN f1.field_name='age' THEN nf1.value END) as Age, 
MAX(CASE WHEN f1.field_name='email' THEN nf1.value END) as Email, 
MAX(CASE WHEN f1.field_name='gender' THEN nf1.value END) as Gender 
FROM 
    number AS n 
     LEFT JOIN 
    number_field AS nf1 ON n.id = nf1.number_id 
     RIGHT JOIN 
    field AS f1 ON f1.id = nf1.field_id 
WHERE 
    1 = 1 
GROUP BY n.number,n.name 
ORDER BY number 

FIDDLE

Dynamic

SET SESSION group_concat_max_len = 1000000; 

SET @sql = NULL; 
SELECT 
GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(CASE WHEN f1.field_name= ''', 
     f1.field_name, 
     ''' THEN nf1.`value` END) AS ', 
     f1.field_name 
    ) 
    )INTO @sql 
FROM 
    number_field AS nf1 
     RIGHT JOIN 
    field AS f1 ON f1.id = nf1.field_id 
ORDER BY f1.field_name; 


SET @sql=CONCAT('SELECT n.number, n.name, ',@sql,' FROM 
    number AS n 
     LEFT JOIN 
    number_field AS nf1 ON n.id = nf1.number_id 
     RIGHT JOIN 
    field AS f1 ON f1.id = nf1.field_id 
GROUP BY n.number,n.name 
ORDER BY number'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

FIDDLE

+0

да, но тот, если у нас есть только эти 3 поля и делать это жёстко, как это, но что, если есть 10 полей созданный по требованию пользователя. Хотя это приятное решение, и мы добираемся туда вплотную :)) .. СПАСИБО BTW – user3570930

+0

@ user3570930 Хорошо, это также можно сделать динамически. – Mihai

+1

УДИВИТЕЛЬНЫЙ! БЛАГОДАРЯ ! – user3570930

Смежные вопросы