我需要在table_a中获取每个组的成员,并查看table_b中是否有一个或多个具有完全相同成员的组,如果这样将结果组名称添加到结果中。
table_a拥有小组成员:
+-------+----------+--------+-------+
|uniqeid|objectname|property|value |
+-------+----------+--------+-------+
|0 |thing1 |color |grey |
+-------+----------+--------+-------+
|1 |thing1 |hardness|100 |
+-------+----------+--------+-------+
|2 |thingy |sofness |80 |
+-------+----------+--------+-------+
|3 |thingy |color |brown |
+-------+----------+--------+-------+
|4 |thingy |emits |gas |
+-------+----------+--------+-------+
|5 |item |exists |1 |
+-------+----------+--------+-------+
继续使用各种属性和对象名的无尽数据。
table_b基本相同,但它包含table_a
中组的对象类型
+-------+----------+---------+
|uniqeid|objecttype|property |
+-------+----------+---------+
|0 |stone |color |
+-------+----------+---------+
|1 |stone |hardness |
+-------+----------+---------+
|2 |stuff |softness |
+-------+----------+---------+
|3 |stuff |color |
+-------+----------+---------+
|4 |stuff |emits |
+-------+----------+---------+
继续加载大量数据。
现在我想制作一个看起来像这样的视图表:
+----------+--------------------+------------+
|objectname|propertys |objecttype |
+----------+--------------------+------------+
|thing1 |color,hardness |stone |
+----------+--------------------+------------+
|thingy |softness,color,emits|stuff |
+----------+--------------------+------------+
|item |exists |NULL |
+----------+--------------------+------------+
如果某个对象成为某种类型,那么两边必须存在确切的属性,重复的属性应该被忽略。
这应该只在mysql中完成。
我尝试将两个群组互相匹配,但是发誓, 和观点不喜欢subquerys。
招呼
答案 0 :(得分:0)
直接的方法是加入属性列表。
幸运的是,mysql具有可以生成这样一个列表的group_concat()
函数,并且可以生成一个适合比较的唯一,一致排序元素的列表:
select
objectname,
a.propertys,
group_concat(objecttype) objecttypes
from (select objectname,
group_concat(distinct property order by property) propertys
from table_a
group by 1) a
left join (select objecttype,
group_concat(distinct property order by property) propertys
from table_b
group by 1) b
on a.propertys = b.propertys
group by 1, 2
如果没有匹配项,左连接就会在最后一列中显示空值。