将groupmembers与另一个组匹配,并将其名称添加到第一个组

时间:2014-06-25 22:56:02

标签: mysql

我需要在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。

招呼

1 个答案:

答案 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

如果没有匹配项,连接就会在最后一列中显示空值。