我只需要一些方向。我有以下表格:
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),在一个结果行中它返回所有数据。
提前致谢!
答案 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 */