2015-04-19 62 views
2

我不知道這個SQL語句,可以在SQL做到這一點SQL不同的內部連接

我表

表: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 

可你知道如何使這樣的查詢..我沒有任何想法..謝謝你這麼多..

+3

數據標準化的,否則您將獲得在的(編程)疼痛 –

+1

世界MySQL沒有像處理分隔列出任何好的機制'X | Y | Z'並加入他們。 – Barmar

+0

在表'value'中設置字段'cluster'外鍵,然後使用'join在tree_hie.cluster = value.cluster'上 – ashkufaraz

回答

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

+0

感謝khalid其工作..但在PHP中執行不能..你知道它是怎麼做到的? – TARA

+0

@tara如果您有其他問題,可以通過添加有關您的錯誤的所有詳細信息來提出新問題 –

+1

okey thanks khalid .. – TARA

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, ' |%') 
+0

是的這是不好的..我只是嘗試你的查詢,不工作.. :( – TARA

+0

它是如何工作的? –

+0

我的數據庫,必須是像這..我只是想想foreach ..在PHP上分隔的ID在tree_hie,但我不能分組.. – TARA