mysql php匹配多个关键字

mysql php匹配多个关键字,php,mysql,Php,Mysql,我有三个表,它们目前的结构如下 Table: Images image_id image_title ... Table: Keywords keyword_id keyword Table: Image_Keyword image_id keyword_id 使用这种结构,我可以使用连接和或语句搜索任何图像是否匹配任何关键字,但是我希望能够检索具有多个关键字匹配的图像,例如“关键字=('red'或'dress')和'night'”,这将返回所有包含“red”或“dress”的图像,以及n

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

Table: Images
image_id
image_title
...

Table: Keywords
keyword_id
keyword

Table: Image_Keyword
image_id
keyword_id
使用这种结构,我可以使用连接和或语句搜索任何图像是否匹配任何关键字,但是我希望能够检索具有多个关键字匹配的图像,例如“关键字=('red'或'dress')和'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') 
对于如何创建此查询的“和”部分的任何帮助,我们将不胜感激!谢谢你

//更新

因此,看起来我必须通过为我需要整理的每个“和”请求创建联接来完成这项工作-但是我现在有了对需求的扩展

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

Table ImageData
id
image_id
caption_id
...

Table Caption
id
data (text)
在本例中,我希望搜索关键字('red'、'dress'和'night'),使用与前面相同的'and'和'OR'功能,但如果字幕数据字段中的文本匹配(使用相同的规则),也会返回图像。我假设我可能会在“关键字”搜索之后使用OR,然后在标题上使用全文搜索,但是我不知道是否有更干净的方法将两者结合起来,甚至可能作为两个单独的查询,然后选择不同的结果-这可能允许在关键字中使用and成功的实例,并且OR在标题中是成功的

任何想法都会很棒


再次感谢

我将在PHP脚本中生成查询的WHERE部分,如下所示:

<?php
$entered_keywords = array('night','red');
$logic = 'OR'; // or 'AND'
$sql_where = implode(' '.$logic.' ', "k.keyword='$entered_keywords'"); //don't forget the escaping here!
$sql = '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 '.$sql_where;
?>

我想你最终的结局是-

  • 一个内部连接适用于所有用户
  • 一个内部连接,每个连接用于所有AND
  • 例如—

    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生成它,但如果我有三个关键字,比如“红色”、“连衣裙”和“夜晚”,那就更麻烦了——如果我想找到包含这些确切关键字的图片,那么在当前设置中,'和'不会这样做。如以下查询中所示:从图像中选择i.*i JOIN image_keyword ik ON i.id=ik.image_id JOIN keywords k ON k.id=ik.keyword_id其中k.keyword='night'和k.keyword='red'和k.keyword='dress'?嘿-是的,谢谢你这么做,我在想我可能需要为每个人创建一个新的连接,虽然我真的希望不会是这样!我会尝试一下,让你知道-谢谢你:)我在使用这个问题的同时,在上面的问题中添加了额外的搜索-你有什么建议吗?