2014-02-06 41 views
3

我有以下表如何在MySQL查詢本身中檢索存儲在JSON數組中的值?

product_id product_name image_path        misc 
---------- -------------- ------------       ------ 
    1   flex  http://firstpl...  {"course_level_id":19,"group_id":"40067"} 
    2   Android  http://firstpl...  {"course_level_id":20,"group_id":"40072"} 

所以,我怎麼可以檢索PRODUCT_NAME,IMAGE_PATH &只有「GROUP_ID」值就像從「雜項」列「40067」。

我試過下面的查詢,但它在Misc列中返回1/0。

SELECT product_name,image_path,misc REGEXP '(.*\"group_id\":*)' as Misc FROM ref_products where product_id=1 

任何想法的傢伙如何做到這一點?

+3

你不應該有它保存在JSON在首位,然後。 – zerkms

+1

沒有朋友它的一個簡單的方法來做,而是在一列中添加更多的列存儲。如果有任何解決方案,然後歡迎 –

+0

@RIADev - 這很容易:將數據放入,然後你不能再出來。您應該將這些數據存儲在不同的列中。 – 2014-02-06 06:19:24

回答

5

REGEXP函數只返回0或1.您將不得不使用其他字符串函數。

試試這個:substr(misc,locate('group_id',misc)+11,5) as Misc。但是,假定group_id始終有5個字符。

所以這是更好的:substring_index(substr(misc,locate('group_id',misc)+char_length('group_id')+3),'"',1) as Misc

這裏是展示它的工作小提琴:http://sqlfiddle.com/#!2/ea02e/15

編輯您可以通過包括雙引號和冒號在字符串這樣擺脫+3魔數: substring_index(substr(misc,locate('"group_id":"',misc)+char_length('"group_id":"')),'"',1) as Misc

+0

高超的夥伴它的工作很棒。 –

+0

我相信應該指出,這很奇怪。這是您數據庫中的數據,您應該使用代碼(不在數據庫中)使用它。否則,你甚至可以在這個值上加入'JOIN'。如果你真的需要在SQL中擁有這個特定的數據點,那麼你應該把它保存爲一個,而不是這個JSON-in-column的東西。 – Nanne

+0

@Nanne我沒有明白你的觀點。以JSON格式保存數據真的很糟糕。 –

2

你可以使用一個用於MySQL的common_schema框架(與所有MySQL> = 5.1兼容),然後通過這種方式得到你需要的東西:

SELECT x.product_name, x.image_path, common_schema.extract_json_value(x.misc,'/group_id') as group_id FROM your_table x 

common_schema框架:https://code.google.com/p/common-schema/

2

由於這個問題被問到,MySQL已經引入了對JSON數據類型的支持。

在MySQL 5.7.8(及更高版本)中,您可以使用JSON_EXTRACT()或等效的->別名查詢存儲在列中的實際JSON字符串。

EG:

SELECT product_name, image_path, JSON_EXTRACT(misc,'$.group_id') AS `group_id` 
FROM ref_products 
WHERE product_id=1 

參見:https://dev.mysql.com/doc/refman/5.7/en/json.html

相關問題