2015-11-18 38 views
0

我有一个包含餐厅信息的mySQL表。部分信息是以逗号分隔的数字列表,对应于餐厅提供的美食类型。我在从数据库中获取正确信息时遇到了一些问题。表看起来像匹配逗号分隔列表的mySQL模式

id businessName cuisine_id 
1 Pizza Place 2,3,4, 
2 Burger Place 12,13,14, 

我想出了

SELECT * FROM restaurant WHERE cuisine_id LIKE "%2,%" 

但是,这让我与它匹配的问题, “2”, “12” 和22“。

我也试图

SELECT * FROM restaurant WHERE cuisine_id LIKE "[^0-9]2,%" 

但这返回任何内容。

有关如何编写此表达式的任何建议?

回答

4

使用regexp

SELECT * FROM restaurant WHERE cuisine_id REGEXP "(^|,)2," 

对于NUM精确匹配,

SELECT * FROM restaurant WHERE cuisine_id regexp "(^|,)2(,|$)" 

注意^$作为正则表达式锚具有管线的起点和终点结束匹配提及。这个(^|,)将匹配一行或逗号的开头。所以这确保了以下模式必须在开始或以逗号开头。

+2

很好的解决方案,但我想他应该改变他的数据库结构,因为保存在一个表中的所有ID不是好。我也会建议去他的分贝(并且利用关系)他的分贝。 – davejal

+0

谢谢Avinash,工作完美。 Davejal,您和fthiella指出,这可能不是存储此数据的最佳方式。我将开始正常化数据库。这不是我能从更好地使用关系中受益的唯一地方。感谢您的建议。 – David

1

有没有必要使用正则表达式,你可以使用FIND_IN_SET字符串函数:

SELECT * FROM restaurant WHERE FIND_IN_SET('2', cuisine_id)>0 

或使用CONCAT:

SELECT * FROM restaurant WHERE CONCAT(',', cuisine_id, ',') LIKE '%,2,%' 

或更好的标准化数据库结构(往往不是一个好想法在一个字段中存储逗号分隔值)