2013-06-11 29 views
0
更換

數據庫:MySQL的加入,爲逗號分隔字符串

table1 schema: name=q_values; columns= id, name; 
table2 schema: name=signup_protect; columns= first_name, last_name, uid; 
table3 schema: name=user_result; columns= uid, value_ids; 

table1 data: [1, forest], [2, mountains] 
table2 data: [test, test, 123] 
table 3 data: [123, {1:2}] 

我需要這給了我這個結果查詢:

test, test, {forest, mountains} 

這意味着我的UID加入註冊與結果,並我將value_ids替換爲q_value的名稱。

這是我到目前爲止所做的,但我只獲得了昏迷值的名字。

SELECT `signup_protect`.`first_name`, `signup_protect`.`last_name`, 
(select name from q_values where id in (replace(`user_results`.`value_ids`,':', ','))) 
FROM (`signup_protect`) JOIN `user_results` ON `user_results`.`uid` = `signup_protect`.`uid` 

我用

,以取代我的字符串逗號冒號,所以我可以把它們作爲數組。

+3

參見[是數據庫列存儲分隔列表真那麼壞?](http://stackoverflow.com/a/3653574) – eggyal

+0

表3中的數據字面上存儲爲「」{1:2}「'(5個字符)? –

+0

問題是'IN'需要一個逗號分隔的列表,但是你給它一個字符串。看看我的這個問題:http://stackoverflow.com/q/4155873/206403,請考慮*不*在數據庫中存儲(逗號)分隔的列表,你應該有一行的每個值(做它,稍後你會感謝我)。 –

回答

2

我也建議規範化數據庫的設計。

不過失敗了,可能有幾種方法。例如像這樣的東西(未測試): -

SELECT a.first_name, a.last_name, GROUP_CONCAT(DISTINCT c.name) 
FROM signup_protect a 
INNER JOIN user_results b 
ON b.uid = a.uid 
INNER JOIN q_values c 
ON FIND_IN_SET(c.id, REPLACE(b.value_ids, ':', ',')) > 0 
GROUP BY a.first_name, a.last_name 

不要期望它快!

根據提示通過火箭危險品最好是GROUP BY一個真正獨特的價值(名稱可能不是唯一的),因此這樣的事情: -

SELECT a.uid, a.first_name, a.last_name, GROUP_CONCAT(DISTINCT c.name) 
FROM signup_protect a 
INNER JOIN user_results b 
ON b.uid = a.uid 
INNER JOIN q_values c 
ON FIND_IN_SET(c.id, REPLACE(b.value_ids, ':', ',')) > 0 
GROUP BY a.uid 
+0

這個可以工作,但是當有多個記錄時,我不會從value_ids獲得c.name,但我得到的不止是這個例子:對於這些id:2:23: 42:45:57:76:82:92,我得到了所有這些名字:山脈,溼地,溼地,新奧爾良,雞蛋,米飯,米飯,新鮮蔬菜,桃子,桃子,巧克力,派,酒,咖啡,茶,曲棍球,曲棍球,跑步,跑步,室外音樂,戶外音樂,旅行,攝影,和平,和平,社區,社區,朋友,朋友,鳥,馬 – sm13294

+0

你可以添加一個DISTINCT子句到GROUP_CONCAT應該修復如果你的意思是刪除重複項) – Kickstart

+0

不,它仍然會返回比ID更多的名字 – sm13294