我正在处理内部搜索引擎(MySQL db)的 SQL 请求。我希望允许用户搜索精确的表达式,因此当他们搜索 "foo bar"
时,他们会得到包含 foo
AND bar
的文档,并且不仅仅是 foo
或 bar
。
search_documents_words
表:
| word_id | doc_id | word |
---------------------------
| 1 | 1 | foo |
| 2 | 1 | bar |
| 3 | 2 | foo |
search_documents
表:
| doc_id | doc_name |
---------------------
| 1 | mydoc1 |
| 2 | mydoc2 |
我想要得到什么:
| doc_id | doc_name |
--------------------
| 1 | mydoc1 |
假设我的关键字位于 PHP 数组中。
我怎样才能实现这一目标?
最佳答案
假设您的搜索关键字在数组中
$search = array('foo','bar');
$keywords = '';
foreach($search as $values) {
$keywords .= "'.$values.',";
}
$keywords = rtrim($keywords,","); // creating words as 'foo','bar'
然后执行这个查询
$query = "SELECT B.*
FROM search_documents_words A
JOIN search_documents B ON A.doc_id = B.doc_id
WHERE A.word IN(".$keywords.")";
已编辑
如果相同的文档 ID 不重复单词(包含许多 foo 条目的文档 1 不适用于此查询),则这种情况将起作用
$query = "SELECT B.*
FROM search_documents_words A
JOIN search_documents B ON A.doc_id = B.doc_id
WHERE A.word IN(".$keywords.")
GROUP BY A.doc_id HAVING COUNT(A.doc_id) = '".count($search)."' ";
关于mysql - 如何选择具有相同 ID 共享一组值的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26035924/