2014-11-21 46 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个连接以单行形式得到结果(仍然没有列名作为field_value)。

我接过来一看到下面的(可能重复):

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

但犯规话不多,我(不是在MySQL :(经验)

如果可能的话,我会如果感谢任何人都可以指导我如何实现它一下。

在此先感谢。

回答

1

我想你想THI的查询

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

动态

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 2014-11-21 00:22:11

+0

@ user3570930好吧,它也可以动态完成。 – Mihai 2014-11-21 00:24:04

+1

真棒!谢谢 ! – user3570930 2014-11-21 11:01:53