2015-07-05 33 views
2

我正在开发一个与其他人开始的项目。在db中,为了使用单独的表格,开发人员选择使用逗号分隔的表格将1 to many关系保存在单个表格上。该表的结构是这样的在逗号分隔的mysql列上搜索

CREATE TABLE pages(
    pageid INT(6) AUTO_INCREMENT PRIMARY KEY, 
    newsid INT(6), 
    pages VARCHAR(30) 
);  

我怎样才能从列pages搜索价值1。我已经确定了可能出现的一些情况,但无法为其创建解决方案。

如果我在寻找1以下模式应该是手柄

1, match 
11 shouldn't match 
11, shouldn't match 
,1, match 
,1 match 
1 match 
21 shouldn't match 
21, shouldn't match 

我一直在思考这个了一段时间,但没有办法解决了上来。我不认为正常%LIKE%可以在这里

SQL示例使用上sqlfiddle

此外,我需要寻找多个值太像173

+0

这就是为什么数据库应该被归到开始..这个问题出现过于频繁。 – user2864740

+0

尝试[正常化](http://stackoverflow.com/questions/17308669/reverse-group-concat-in-mysql)你的数据库。这将是值得的努力。 –

+0

没有更好的解决方案 – Drew

回答

3

使用 FIND_IN_SET()

实施例:

SELECT * FROM pages WHERE FIND_IN_SET('1', pages) 

从文档:

FIND_IN_SET(STR,strlist)

返回的1至N,如果范围内的值字符串str位于由N个子字符串组成的字符串列表strlist中。 字符串列表是由由“,”字符分隔的子字符串组成的字符串。如果第一个参数是一个常量字符串,第二个参数是SET类型的一列,那么FIND_IN_SET()函数会优化为使用位算术。 如果str不在strlist中,或者strlist是空字符串,则返回0。如果任一参数为NULL,则返回NULL。如果第一个参数包含逗号(“,”)字符,则此函数无法正常工作。

(高亮加)

+0

还没有在早些时候注意过该函数......谢谢 – livestrong

+0

注意:虽然这是处理现有结构的适当方式,但FIND_IN_SET不能使用索引。 – user2864740

+0

也用于搜索多个值,这将足够'FIND_IN_SET('1',页)和FIND_IN_SET('7',页)'...对吗?我试过了,它的工作正常,但不知道它是否会在某个时间点崩溃 – livestrong