【问题标题】:mysql php match multiple keywordsmysql php匹配多个关键字
【发布时间】:2011-02-24 16:32:46
【问题描述】:

我有三个表,目前按以下方式构造

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' 的图像,以及夜晚。

理想情况下,我希望允许用户能够在搜索框中指定 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 在标题中成功的情况。

任何想法都会很棒

再次感谢

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    我想你最终会是这样 -

    1. 一个 INNER JOIN 用于您的所有 OR。
    2. 一个 INNER JOIN 用于你所有的 ands。

    例如——

    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";
    

    你明白了..

    【讨论】:

    • 嘿 - 是的,谢谢你,我想我可能必须为每个人创建一个新的连接,尽管我真的希望不必如此!我会试试看,让你知道 - 非常感谢 :)
    • 我在使用这个以及添加到上面问题中的额外搜索时遇到问题 - 您有什么可以建议的吗?
    【解决方案2】:

    我会在 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;
    ?>
    

    【讨论】:

    • 我会在 PHP 中生成它,但如果我有三个关键字,比如“red”、“dress”和“night”,那就更成问题了——如果我想找到包含那些确切的关键字,'AND'不会在当前设置中执行。如以下查询: 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 = 'night' and k.keyword = 'red '
    • WHERE k.keyword = 'night' and k.keyword = 'red' and k.keyword = 'dress' ?
    猜你喜欢
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2018-12-16
    相关资源
    最近更新 更多