这是一个挑战。暴力方法是在一个带有计数的子查询中使用UNION。
例如,
select id, file, count(*) from
(select distinct id, file
from file_table
where FIND_IN_SET(keyword1, keywords)
UNION ALL
select distinct id, file
from file_table
where FIND_IN_SET(keyword2, keywords)
UNION ALL
select distinct id, file
from file_table
where FIND_IN_SET(keyword3, keywords)
UNION ALL
select distinct id, file
from file_table
where FIND_IN_SET(keyword4, keywords)
.... MORE UNION ALL ....) as files
group by id, file
having count(*) >= 3
更有效,你可以有关键字和ID,一个关键字/每行ID组合一个单独的表。这将消除通配符搜索并使查询更有效。
接下来的步骤是去ElasticSearch之类的东西,并过滤结果的分数。
那么什么是你的其他的表结构看起来就像你正在寻找对抗......或者是这样的吧,你只是用一个字符串来比较。如果是这样,关键字上下文设计不佳。 – DRapp 2012-02-04 17:11:30
还没有其他表。我必须在现场搜索:关键字。 – Svetoslav 2012-02-04 17:14:53
@Svetlio:表格结构是您的选择吗?你是如何使用逗号分隔值列来的?如果你看过这将是良好[规范化](http://en.wikipedia.org/wiki/Database_normalization),并在关系表中存储逗号分隔值的问题:是存储一个逗号数据库中的列分隔列表真那坏?](http://stackoverflow.com/questions/3653462/is-storing-a-comma-separated-list-in-a-database-column-really-that-bad) – 2012-02-04 17:34:11