我正在研究像这样的mysql数据库
CREATE TABLE IF NOT EXISTS `tblcustomfieldsvalues` (
`fieldid` int(11) NOT NULL,
`relid` int(1) NOT NULL,
`values` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
和下面的示例数据
INSERT INTO `tblcustomfieldsvalues`(`fieldid`, `relid`, `values`) VALUES
('396', '1', 'willyemail@gmail.com'),
('397', '1', 'willy robertus'),
('398', '1', 'Santo Paulus'),
('396', '2', 'antoni@gmail.com'),
('397', '2', 'Antoni robertus'),
('398', '2', 'Sasa Paulus');
给我这样的东西
The Actual Data Image
我的目标:
我需要针对每个不同的fieldid将数据转换为不同的列
假设我希望将字段ID 396作为A列,将397作为B并将398字段ID作为C列
因此,数据看起来像这样
Expectation
但是我有这样的东西
我试过这个查询
select
relid,
case when fieldid = "396" then tblcustomfieldsvalues.values end as A,
case when fieldid = "397" then tblcustomfieldsvalues.values end as B,
case when fieldid = "398" then tblcustomfieldsvalues.values end as C
from tblcustomfieldsvalues
几乎符合我的期望,但是有很多空值
relid A B C
1 willyrobertus@gmail.com (null) (null)
1 (null) willy robertus (null)
1 (null) (null) Santo Paulus
2 antoni@gmail.com (null) (null)
2 (null) Antoni robertus (null)
2 (null) (null) Sasa Paulus
尝试按隐藏分组,我得到不匹配的行
SQLFiddle
非常感谢你
威利
最佳答案
您需要条件聚合
DEMO
select
relid,
max(case when fieldid = "396" then tblcustomfieldsvalues.values end) as A,
max(case when fieldid = "397" then tblcustomfieldsvalues.values end) as B,
max(case when fieldid = "398" then tblcustomfieldsvalues.values end) as C
from tblcustomfieldsvalues
group by relid
输出:
relid A B C
1 willyemail@gmail.com willy robertus Santo Paulus
2 antoni@gmail.com Antoni robertus Sasa Paulus