2013-10-16 54 views
2

我試圖檢查一個單元格中是否存在國家代碼country,然後用戶可以向數據庫添加任何內容。所以,如果國家代碼不存在,他將無法添加任何內容。檢查一個單元格中是否存在國家代碼

我將國家代碼存儲爲逗號分隔值。列類型是VARCHAR。

"id" "rtype" "country" 
"1"  "0"  "US,UK,SE,CA" 
"2"  "1"  "US" 
"3"  "2"  "UK" 

我運行了以下查詢,但是這不會產生任何結果。這裏錯在哪裏?問題是,這個查詢需要使用逗號分隔值以及單個值運行。

select id, rtype from test where id=1 and country in('US') 

預期結果

id | rType 
1 | 0 

select id, rtype from test where id=2 and country in('US') 

預期結果

id | rType 
2 | 0 
+1

您應該檢查您的數據模型並考慮[規範化](http://en.wikipedia.org/wiki/Database_normalization)數據庫。 – Wolf

+0

完全同意狼 –

+0

正常化。第一行由管理員設置。其餘的都是用戶添加的。 – jmenezes

回答

3

嘗試了這一點:

SELECT id, rtype FROM test 
WHERE FIND_IN_SET('US', country) > 0 

這是FIND_IN_SET(str,strlist)功能如何工作的:

在1到N的範圍內,則返回一個值,如果字符串str在由N子串的字符串列表strlist。字符串列表是由由「,」字符分隔的子字符串組成的字符串。 [...]如果str不在strlist中,或者strlist是空字符串,則返回0。

0

由於國家代碼是逗號分隔值,因此不能直接在英寸中使用。 你可以喜歡。

選擇ID,從測試舍入類型,其中國家LIKE '%美國%'

+0

這實際上會匹配其他字符串,例如'SE,RUS,ARG' –

1

MySQL有一個非常好的Set Datatype。它非常高效,可存儲255個值的64個不同成員。我不知道,如果你可以改變你列的類型,但它會解決很多問題:

  1. 你的列將可轉位
  2. 你會不會按錯
  3. 它會存儲重複值可以非常有效地存儲
  4. 無效值會被忽略(或錯誤,如果在嚴格模式)
  5. 尾部的空格被刪除

你變奏h使用FIND_IN_SET函數。

相關問題