SQL不同的内连接

时间:2015-04-19 03:09:05

标签: php mysql sql

我不知道这个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

你可能知道怎么做这样的查询..我也没有任何想法..非常感谢你..

2 个答案:

答案 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数据结构

DEMO