Mysql 如何选择共享一组值的具有相同ID的行?

Mysql 如何选择共享一组值的具有相同ID的行?,mysql,sql,Mysql,Sql,我正在处理一个内部搜索引擎MySQL db的SQL请求。我想允许用户搜索精确的表达式,所以当他们搜索foo-bar时,他们会得到包含foo和bar的文档,而不仅仅是foo或bar 搜索文档词表: 搜索文档表: 我想要的是: | doc_id | doc_name | -------------------- | 1 | mydoc1 | 假设我的关键字在PHP数组中 我怎样才能做到这一点呢?假设您的搜索关键字在数组中 $search = array('foo','bar'); $

我正在处理一个内部搜索引擎MySQL db的SQL请求。我想允许用户搜索精确的表达式,所以当他们搜索foo-bar时,他们会得到包含foo和bar的文档,而不仅仅是foo或bar

搜索文档词表:

搜索文档表:

我想要的是:

| 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条目的word doc 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)."' ";

您可以使用GROUP_CONCAT和HAVING子句

 SELECT sd.doc_id, 
           sd.doc_name,
 GROUP_CONCAT(sdw.word     Order by sdw.word SEPARATOR ' ') AS sdwWord
  FROM search_documents sd
  JOIN search_documents_words sdw ON sd.doc_id = sdw.doc_id 
  GROUP BY sd.doc_id, sd.doc_name 
  HAVING sdwWord = <search expression>

子查询的构建方式如下:

$keywords = array('foo','bar');
foreach($keywords as $key)
{
  $conditions[] = "word='".$key."'"; 
}
$condition = implode(" AND ",$conditions);
然后执行以下sql查询:

$query = "SELECT * 
          FROM search_documents 
          WHERE doc_id
          IN (SELECT doc_id 
              FROM search_documents_words 
              WHERE ".$condition.")"

希望这有帮助

没有安装MySQL,但我认为您的查询需要在B之前有一个DISTINCT.*如果我是对的,那么这个查询将只查找foo或bar,而不是foo和bar。这与我在常规搜索中使用的非常相似;它将同时查找foo和bar。先试试。我只是试了一下,使用完全相同的代码,结果只有foo或bar。我添加了一个count列只是为了确保这一点,有很多结果没有bar或foo,但有一个,这不是我想要的。如果你看一下文档中对IN条件的描述,它是有意义的:IN是由and构成的,而不是由and构成的。对不起,我误解了这个问题。让我试试,这个问题似乎很有趣。如果关键字的顺序与数据库中的顺序不同,您如何处理此查询?因为如果GROUP_CONCAT返回bar foo,have将不接受foo bar。除非有一个我不知道的函数,我可以使用它。@vard,很好的观点,添加了order by,它只对foo-bar位有效,对bar-foo无效,如果你想让bar-foo也匹配,那么这个组合需要添加到search\u documents\u words表中。我觉得这是正确的答案!我会尽快确认服务器会回来,我希望这不是让他崩溃的查询我有大约30k的关键字和~5k的文档。对于记录,这里是我最后的查询:选择sdoc\u id,搜索文档中的sdoc\u文档,搜索文档中的sdoc\u id=swd\u doc,以及从搜索文档中选择sdoc\u id中的sdoc\u id。内爆'和',$条件。按sdoc_id分组到目前为止,我只有一个在函数中使用的查询-这很好用,但只用于常规搜索:从搜索文档中选择sdoc_id、sdoc_文档、sdoc_类型、搜索文档,其中sdoc_id=swd_文档和swd_word。连接“,”和“$”单词。按sdoc_id分组
$keywords = array('foo','bar');
foreach($keywords as $key)
{
  $conditions[] = "word='".$key."'"; 
}
$condition = implode(" AND ",$conditions);
$query = "SELECT * 
          FROM search_documents 
          WHERE doc_id
          IN (SELECT doc_id 
              FROM search_documents_words 
              WHERE ".$condition.")"