我试图在一行中得到结果,有什么建议吗?
表项目
idItem idCampain name
1 1 Item1
2 2 Item2
表ItemExtraField
IdItemExtraField idExtraFied idItem strValue
1 1 1 33
2 2 1 5
表格ExtraField
idExtraField nameExtra description
1 age age
2 lifes lifes
如果我进行简单的加入:
SELECT A.*, C.nameExtra, B.strValue FROM Item A
INNER JOIN ItemExtraField B ON B.idItem= A.idItem
INNER JOIN ExtraField C ON C.idExtraField = B.idExtraField
where A.idCampain = 1
得到了这个结果:
idItem idCampain name nameExtra strValue
1 1 Item1 age 33
1 1 Item1 lifes 5
但我需要这个:
idItem idCapain name age lifes
1 1 Item1 33 5
我真的尝试了很多选项,但无法获得我需要的结果。 非常感谢任何帮助。
****已编辑****
我找到了一个解决方案:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when nameExtra= ''',
nameExtra,
''' then strValue else NULL end) AS ',
strExtra
)
) INTO @sql
FROM ExtraField A
INNER JOIN ItemExtraField B ON B.idItemExtraField = A.idItemExtraField ;
SET @sql = CONCAT('SELECT L.*, ', @sql, '
from Item L
left join ItemExtraField CE
on L.idItem = CE.idItem
left join ExtraField C ON C.idExtraField = CE.idExtraField
group by L.idItem');
SELECT @SQL;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
我使用了一个程序而且它有效。 谢谢你的帮助!
答案 0 :(得分:0)
您的加入条件不够严格。您的INNER JOIN ItemExtraField B ON B.idItem= A.idItem
会撤回您提供的ItemExtraField
表的两行,因为两者都匹配idItem
的1. {这两行在ExtraField
上恰好连接到一行表。这就是你获得2行的原因。
INNER JOIN
对ItemExtraField
表的额外限制将消除不需要的行。
很难从您提供的信息中确切地告诉您所需要的信息,但此更改将为您提供所需的结果集。
SELECT A.*, C.nameExtra, B.strValue FROM Item A
INNER JOIN ItemExtraField B ON B.idItem= A.idItem
AND B.IdExtraItemField = A.idItem --Not sure how you would determine this criterion
INNER JOIN ExtraField C ON C.idExtraField = B.idExtraField
where A.idCampain = 1
答案 1 :(得分:0)
尝试这样的事情:
SELECT A.*,
(
SELECT C.strValue
FROM ExtraField C
inner join ItemExtraField B ON (B.idExtraField = C.idExtraField)
WHERE nameExtra ='age' AND b.idItem = A.idItem
) age
From Item A
where A.idCampain = 1