我有这些表格:
Objects
ID | Name
----------
1 name1
Tags
ID | ObjectId | Tag
--------------------
1 1 tag1
2 1 tag2
Attributes
ID | ObjectId | Key | Value
--------------------
1 1 key1 value1
2 1 key2 value2我想写一个查询,它只有一行,如下所示:
id = 1
name = name1
tags = tag1,tag2
attributes = key1=value1,key2=value2但是,此查询:
SELECT o.name,
GROUP_CONCAT(t.tag) as tags,
GROUP_CONCAT(CONCAT(a,'=',a.value)) as attributes
FROM objects o
LEFT JOIN attributes a on a.ObjectId = o.id
LEFT JOIN tags t on t.ObjectId = o.id
WHERE p.id = 1给出了这个单行结果,其中包含重复的标记/属性值
id = 1
name = name1
tags = tag1,tag1,tag2,tag2
attributes = key1=value1,key2=value2,key1=value1,key2=value2发布于 2019-06-15 04:29:53
您的解决方案的问题是,您正在针对所有相关的属性连接所有相关的标记,从而有效地产生交叉连接。
相反,您可以使用标量子查询。例如,您可以将其编写为:
select
id,
name,
(SELECT GROUP_CONCAT(t.tag) FROM tags t on t.ObjectId = o.id) as tags,
(SELECT GROUP_CONCAT(CONCAT(a.key,'=',a.value))
FROM attributes a on a.ObjectId = o.id) as attributes
FROM objects o
WHERE id = 1https://stackoverflow.com/questions/56604664
复制相似问题