php - mysql php匹配多个关键字

标签 php mysql

我有三个表,它们目前的结构如下

Table: Images
image_id
image_title
...

Table: Keywords
keyword_id
keyword

Table: Image_Keyword
image_id
keyword_id

使用这种结构,我可以使用连接和或语句搜索是否有任何图像与任何关键字匹配 - 但是我希望能够检索具有多个关键字匹配的图像,例如“keyword = ('red' or 'dress') and 'night'” - 这将返回所有包含 'red' 或 'dress' 的图像,以及 night。

理想情况下,我希望允许用户能够在搜索框中指定 AND 和 OR 命令,这就是为什么我到目前为止选择不为每个新关键字进行单独的联接 - 但我不确定如何继续查询的结构。

目前我有以下内容,没有“和”实现:

SELECT i.* FROM images i
JOIN image_keyword ik ON i.id = ik.image_id
JOIN keywords k ON k.id = ik.keyword_id
WHERE k.keyword IN ('night','red') 

如果您能提供有关如何创建此查询的“和”部分的任何帮助,我们将不胜感激!非常感谢,

//更新

所以看起来我将不得不通过为每个我需要整理的“AND”请求创建连接来做到这一点 - 但是我现在对要求进行了扩展......

我还有另外两个表,它们遵循以下结构

Table ImageData
id
image_id
caption_id
...

Table Caption
id
data (text)

在这种情况下,我想搜索关键字('red'、'dress' 和 'night'),使用与以前相同的 'AND' 和 'OR' 功能,但如果标题数据字段中的文本匹配(使用相同的规则)。我假设我可能在“关键字”搜索之后使用 OR,然后在标题上使用全文搜索,但是我不知道是否有更简洁的方式将两者结合起来,甚至可能作为两个单独的查询然后选择不同的结果 - 这可能允许 AND 在关键字中成功,而 OR 在标题中成功。

任何想法都会很棒

再次感谢

最佳答案

我想你最终会是这个——

  1. 所有 OR 的一个 INNER JOIN。
  2. 一个 INNER JOIN,每个用于您的所有人。

例如——

SELECT i.* FROM images i
INNER JOIN image_keyword ik ON i.id = ik.image_id
INNER JOIN keywords kOR ON kOR.id = ik.keyword_id AND (kOR.keyword IN ('dress', 'red'))
INNER JOIN keywords kAND1 ON kAND1.id = ik.keyword_id AND kAND1.keyword = 'night'

PHP 脚本看起来像这样。

$orKeywords = arrya('dress', 'red', 'white');
$andKeywords = array('night', 'day');
$orJoin = '';
$andJoin = '';
if(count($orKeywords) > 0)
{
    $orCondition = "'".implode("', '", $orKeywords)."'";
    $orJoin = " INNER JOIN keywords kOR ON kOR.id = ik.keyword_id AND kOR.keyword IN ($orCondition) ";
}
if(count($andKeywords) > 0)
{
    $cnt = 1;
    foreach($andKeywords as $keyword)
    {
        $andJoin .= " INNER JOIN keywords kAND{$cnt} ON kAND{$cnt}.id = ik.keyword_id AND kAND{$cnt}.keyword = '$keyword' ";$cnt++;
    }
}
$sql = "SELECT i.* FROM images i
INNER JOIN image_keyword ik ON i.id = ik.image_id
$orJoin
$andJoin";

你明白了..

关于php - mysql php匹配多个关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5107527/

相关文章:

php - 将对象从 PHP 传递到 Mysql 存储过程

MYSQL 快速插入依赖于来自单独表的标志

mysql - 这种情况应该如何设计数据库关系

mysql - 如何在嵌套的两级子查询中使用外表?

php - 使用 PHP 和 apache (MAMP) 运行 wget

Php foreach 循环仅在检查重复项时在 mysql 中添加第一行

php - PHP 中的嵌套 foreach 产生与我预期不同的结果

php - PHP 中是否有可选链接?

javascript - 使用 e.preventDefault() 的联系表单;不现场工作

php - WordPress – 按元值按字母顺序对帖子进行排序