我不知道这个sql,可以sql做这个
我有桌子
table:tree_hie
cluster | id
1 | X | Y
2 | X | Y | Z
3 | A | B
表:值
id | value
x | 3
y | 3
z | 3
a | 0
b | 0
我希望像这样显示
cluster | value | id
1 | 3 | x,y
2 | 3 | x,y,z
3 | 0 |a,b
你可能知道怎么做这样的查询..我也没有任何想法..非常感谢你..
答案 0 :(得分:1)
如果我理解正确,您需要在两个表之间进行连接:
select th.cluster,
min(v.value) as value,
group_concat(v.id) as ids
from tree_hie th join
value v
on concat('|', th.id, '|') like concat('%|', v.id, '|%')
group by th.cluster;
您已在单个字段中存储了一个ID列表,并使用竖线作为分隔符。这是一个糟糕的数据结构。您应该使用联结表,每个群集一行,单个ID。
编辑:
如果分隔符真的是' | '
,则为空格:
on concat('| ', th.id, ' |') like concat('%| ', v.id, ' |%')
答案 1 :(得分:1)
您还可以使用replace
首先用逗号代替空格和|
管道,然后使用find_in_set
select t.cluster,
min(v.`value`) as value,
group_concat(v.id order by v.id) as id
from tree_hie t
join `value` v on (
find_in_set(
v.id,replace(replace(t.id,'|',','),' ','')
) > 0
)
group by t.cluster
但是这样的结构非常糟糕你应该先关注normalized数据结构