我正在研究像这样的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

08-04 05:51
查看更多