2013-07-19 141 views
3

我有一個表格,其中包含很少id的列,這些列已通過多選select語句放入數據庫中。列例如包含:1,4,5,7,9。是否可以通過MySQL查詢來檢查此列是否包含例如數字5或不包含在其中? 我需要選擇所有編號爲5或列在該字段中的其他人,並通過php打印出來。檢查mysql字段是否包含mysql查詢中的某個數字

+2

這絕對有可能。你可以用LIKE語句來做到這一點;儘管如果你的數據庫設計被標準化了,對你來說會更容易些。 – andrewsi

回答

9

http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_find-in-set

SELECT ... 
WHERE FIND_IN_SET(5, list_column) 

但要知道,這搜索勢必是非常慢的。它不能使用索引,它會導致完整的表掃描(讀取表中的每一行)。隨着表的增長,查詢將變得無法緩慢。

請閱讀我的回答Is storing a delimited list in a database column really that bad?


您可以使用@ MikeChristensen的回答更加標準。與標準的SQL另一個竅門是:

select * from TableName 
where ',' || ids || ',' LIKE '%,5,%' 

(標準SQL,||是字符串連接運算符,但在MySQL,你必須SET SQL_MODE=PIPES_AS_CONCATSET SQL_MODE=ANSI來獲取行爲)

另一個MySQL-具體解決方法是使用一個特殊的字邊界正則表達式,將匹配逗號標點符號或串的開頭/結束:

select * from TableName 
where ids RLIKE '[[:<:]]5[[:>:]]' 

這些解決方案中沒有很好地擴展;他們都會造成表掃描。對不起,我明白你不能改變數據庫設計,但是如果你的項目接下來需要加快查詢速度,你可以告訴他們,如果不重新設計表格,這是不可能的。

+0

我知道正常的形式:)而且我知道這是不好的。但系統已經由其他人創建,我無法改變它。相信我,我會讓數據庫正常,如果我可以:D。感謝這個功能是好的:)。我會在10分鐘內接受這個答案:) –

+0

'+ 1'爲內置'mySql'功能..我會離開我的答案,因爲它更*標準* .. –

+0

超級回答,完美工作。投票。謝謝 ! –

6

也許:

select * from TableName 
where ids = '5'  -- only 5 
or ids like '5,%' -- begins with 5 
or ids like '%,5' -- ends with 5 
or ids like '%,5,%' -- 5 in the middle somewhere 

它可能不會對大量數據的速度非常快。我建議將這些多選擇值標準化到一個新表中,其中每個選擇是一個單行,並鏈接到TableName

0

你可以寫這樣的sql查詢,例如你正在尋找數字5 select * from your_table_name其中ids ='5' 如果你想用php檢查結果只是告訴我,我會寫它你:)

+0

如果它是該領域唯一的條目,那麼這將起作用;如果該字段爲'1,5,9',則不會找到它。 – andrewsi

+0

是的,:(對不起,我的英語是ABD現在我明白了這個問題,如果提交的例子包含1,5,9,10,3,你想檢查,如果該字段包含10只是寫select * from your_table其中id '%5%'; –

+0

啊,不完全 - 這會錯誤地返回值爲15的人。 – andrewsi

2
select * from your_table where concat(',',target_column,',') like '%,5,%' 
+3

難道那也會拿起15嗎? – andrewsi

+0

select * from your_table concat(',',target_column,',')like'%,5,%'? –

+1

現在很狡猾 - 確保你在任何一端都有一個逗號,所以你只需要一個LIKE語句。 – andrewsi

相關問題