最近做一個項目,遇到一個在分組的情況下,將某一列的字段值(varchar類型)連接起來的問題,類似於sum函數對int型字段值求和。如有一個表t_table,結構和數據如圖1
圖1
其中要按著xh字段分組,並且將每一組name字段值連接起來。最終結果希望如圖2所示
圖2
表中的th字段值對於每一個xh值是唯一的,也是有限的,也就是說,對於一個xh值,th的值不會太多,如最多是10個(從1至10)。
以上需求最終想了三種方法來解決這個問題。
一、修改表結構
如果是新的項目,可以考慮修改一下表的結構。如果t_table的結構修改如下:
xh value1 value2 value3 value4 .... .... value10 0001 123456 654321 456789 0002 12abcd 4d2r343 343dfd 0003 abcde3 132323
這種方法將value的值縱向改為橫向,也就是說,按每一個xh值,將value字段的值按逆時針旋轉了90度。 但這種方法要有一個前提,就是假設xh的每一個值所對應的value值不會太多,如上面不超過10個,這樣才有可能建立有限個字段。如果按著上面的字段結構,只需要將這些字段加一起就可以了,也不用分組。如下所示:
select xh , (value1 + value2 + value3 + + value10) as value from t_table
但這種方法至少有如下三個缺陷:
1. 需要修改表結構,這對於已經進行很長時間或是已經上線的項目產不適用
2. 對每一個xh字段的value取值數有限制,如果太多,就得建立很多字段。這樣性能會降低。
3. 這樣做雖然查詢容易,但如果需要對每一個xh的不同值頻繁修改或加入新的值時,如果把它們都放到一行,容易因為行鎖而降低性能。
關鍵詞: