mysql子查询结果为字段

时间:2015-01-23 15:05:36

标签: mysql subquery field

我试图在一行中得到结果,有什么建议吗?

表项目

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;

我使用了一个程序而且它有效。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

您的加入条件不够严格。您的INNER JOIN ItemExtraField B ON B.idItem= A.idItem会撤回您提供的ItemExtraField表的两行,因为两者都匹配idItem的1. {这两行在ExtraField上恰好连接到一行表。这就是你获得2行的原因。

INNER JOINItemExtraField表的额外限制将消除不需要的行。

很难从您提供的信息中确切地告诉您所需要的信息,但此更改将为您提供所需的结果集。

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