MySQL动态合并/选择选择行

时间:2011-01-11 18:39:49

标签: mysql sql

我只需要一些方向。我有以下表格:

Table: entity
 - ID (INT)

Table: attributes
 - ID (INT)
 - name (VARCHAR)
 - internalname (VARCHAR)

Table: values
 - ID (INT)
 - entity (ID)
 - attributes (INT)
 - value (Text)

我想要的是制作一个Select参数,它将返回如下内容:

 - ID = entity.ID
 - {attributes.internalname ID 1} = values.{attribe internalname 1}.value
 - {attributes.internalname ID 2} = values.{attribe internalname 2}.value
 - {attributes.internalname ID 3} = values.{attribe internalname 3}.value
 - {attributes.internalname ID n} = values.{attribe internalname n}.value
 - etc...

这就像结合:

SELECT entity.id FROM entity;

SELECT (SELECT values.value FROM values WHERE values.entity = entity.ID AND values.attributes = attributes.ID) FROM attributes;

难以解释,但如果您需要我进一步解释,请告诉我。

我实际上想要将属性中的所有值都旋转到列,并将所有值转换为其对应属性的值,并将ID作为选择器。

我给查询一个ID(元素ID),在一个结果行中它返回所有数据。

提前致谢!

2 个答案:

答案 0 :(得分:2)

您无法动态创建列,因此您需要事先知道列的内容。

如果属性(1,2,3,4)代表(firstname,lastname,extraname,additionalname),你可以这样查询:

select e.id
      ,v1.value as firstname
      ,v2.value as lastname
      ,v3.value as extraname
      ,v4.value as additionalname
  from entity e
  left join values v1 on(e.id = v1.entity and v1.attributes = 1)
  left join values v2 on(e.id = v2.entity and v2.attributes = 2)
  left join values v3 on(e.id = v3.entity and v3.attributes = 3)
  left join values v4 on(e.id = v4.entity and v4.attributes = 4)
 where e.id = ?

select e.id
      ,max(case when v.attributes = 1 then value) as firstname
      ,max(case when v.attributes = 2 then value) as lastname
      ,max(case when v.attributes = 3 then value) as extraname
      ,max(case when v.attributes = 4 then value) as additionalname
  from entity e
  left join values v on(e.id = v.entity)
 where v.attributes in(1,2,3,4)
   and e.id = ?
 group by e.id;

您还可以使用GROUP_CONCAT在一列中以逗号分隔列表的形式返回值。

select e.id
      ,group_concat(v.value)
  from entity e
  left join values v on(e.id = v.entity)
 group 
    by e.id;

哦,values是保留字。不要将它用作表名。

哦,2,除非你真的需要,否则不要使用这个模型。在性能和数据一致性方面,您将付出巨大的代价。

答案 1 :(得分:0)

我不会宽恕选择*所以请用你的专栏替换。值可以是保留关键字

   select * 
   from values v

   left join attributes a
     on a.id = v.attributes

   left join entity e
     on e.id = v.entity

   where 1=1

   /* put your where clause here */