2017-08-01 1987 views
0

我的MySQL數據庫中有兩個字段是數組。數據類型顯示爲帶有(DC2Type:array)註釋的LONGTEXT。MySQL在數據庫數組字段中搜索值(整數或字符串)字段

例如,存儲在這一領域的整數值應該是這樣的:
a:4:{i:0;i:9;i:1;i:10;i:2;i:11;i:3;i:12;}

和字符串值應該是這樣的:
a:2:{i:0;s:6:"Value1";i:1;s:6:"Value2";}

我需要這些領域的這種方式讓我可以存儲可過濾的列。例如。第一個可能是年齡組,所以代表年齡段9,10,11,12。

我的查詢,則必須獲得該說是相關的10歲或在某些情況下,說我想找到那些10和11

我試過IN和FIND_IN_SET語法但也不是所有記錄返回任何結果。

使用IN

SELECT * 
FROM table_name 
WHERE MyField IN (10) 

使用FIND_IN_SET

SELECT * 
FROM table_name 
WHERE FIND_IN_SET(MyField,'Value1') > 0; 

我知道陣列可能不是存儲值的最佳領域,但我不想爲每個AgeGroup例如單獨的字段Age1,Age2等或每個類別(例如Value1,Value2等)

有關如何從數據庫數組字段中查找值或值的任何想法?

謝謝!

+0

這個數據是PHP'serialize()'格式。有沒有簡單的方法直接在MySQL中處理它,你需要檢索所有的記錄,使用'unserialize()'然後在那裏測試它。 – Barmar

+0

'FIND_IN_SET'只能使用逗號分隔值。您的字段中的值用';'分隔,而不是','。 – Barmar

回答

0

您可以使用模式匹配。

整數:

WHERE MyField LIKE '%i:10;%' 

字符串:

WHERE MyField LIKE '%s:6:"Value1";%' 

6必須與你要搜索的字符串的長度來代替。

如果你想搜索多個數字或字符串,你可以使用正則表達式與交替:

WHERE MyField RLIKE 'i:(10|11);' 

WHERE MyField RLIKE 's:(6:"Value1"|10:"LongValue2");' 

注意,這些方法都可以使用表上的索引。將數組存儲在數據庫列中通常是一個壞主意,您應該將它們作爲單獨的行存儲在多對多表中。

+0

謝謝! LIKE和RLIKE都像MySQL中的整數和字符串一樣工作。我正在使用Symfony/Doctrine,所以不幸的是它看起來像RLIKE不受支持。現在我必須將過濾條件改爲單一結果(所以我們可以使用LIKE),直到我們可以將體系結構更改爲多對多而不是序列化數組。欣賞快速反應並提供幫助。 – mbg

+0

'RLIKE'是'REGEXP'的另一個名字。 – Barmar

+0

你不能在多個情況下使用'LIKE',因爲它沒有交替。你將不得不寫'MyField LIKE'%i:10;%'或MyField LIKE'%i:11;%' – Barmar