2017-05-01 46 views
0

通過選擇行有問題。有字段location_ids,它有價值例如 - ["13", "5", "25"]。我想在這一領域的搜索,如果它開創13號例如,它選擇一行MySQL通過在數組字段中搜索來選擇行,如果找到值,則選擇該行

我發現它可能與FIND_IN_SET函數來完成,但它並沒有爲我工作SELECT * FROM staffs WHERE FIND_IN_SET(13, locations_ids)

也許這可能是用JSON函數完成?

感謝您的回答

+1

聽起來像你應該規範你的分貝。 –

回答

1

你應該在這種情況下,使用正則表達式。這是我用來搜索json包含的列。它也適用於你的情況。

WHERE locations_ids REGEXP '[[:<:]]13[[:>:]]' 
+0

真棒:),完美的作品:)謝謝。 –

0

爲什麼不重新格式化數組並使用IN?

SELECT * 
FROM staffs 
WHERE locations_ids in (13,5,25) 

如果locations_ids包含[ 「13」, 「5」, 「25」],試試這個:

SELECT * 
FROM staffs 
WHERE locations_ids like '%"13"%' 
+0

我無法重新設置字段值的格式。而我只有一個數字,例如5,我需要找到具有該字段location_ids中的數字的行。 –

+0

所以列位置標識包含方括號列表? –

+0

是的,它包含括號 –

1

FIND_IN_SET(13, locations_ids)會的工作,如果locations_ids'13, 5, 25'。但您的格式,你可以使用

JSON_CONTAINS(location_ids, '"13"') 

演示:http://rextester.com/HLLY47255

注意,無論是通過以下兩種方式可以使用索引來進行快速搜索。隨着規範化模式的查詢可以是:

SELECT s.* 
FROM staffs s 
JOIN staffs_locations sl ON sl.staff_id = s.id 
WHERE sl.location_id = 13; 

和(如果propper索引定義),這將幾乎瞬間甚至數百萬行的返回結果。

相關問題