mysql php匹配多个关键字

时间:2011-02-24 16:32:47

标签: php mysql

我有三个目前按以下方式构建的表

Table: Images
image_id
image_title
...

Table: Keywords
keyword_id
keyword

Table: Image_Keyword
image_id
keyword_id

通过这种结构,我能够使用连接和/或语句搜索任何图像是否匹配任何关键字 - 但是我希望能够检索具有多个关键字匹配的图像,例如“keyword =('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') 

有关如何创建此查询的“和”部分的任何帮助将不胜感激!谢天谢地,

// UPDATE

所以看起来我必须通过为每个'AND'请求创建连接来实现它,我需要对其进行整理 - 但是我现在对需求进行了扩展......

我还有两个遵循以下结构的表

Table ImageData
id
image_id
caption_id
...

Table Caption
id
data (text)

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

任何想法都会很棒

再次感谢

2 个答案:

答案 0 :(得分:1)

我认为你最终将会是这个 -

  1. 所有OR的一个INNER JOIN。
  2. 每个人都有一个INNER JOIN。
  3. 例如 -

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

    你明白了......

答案 1 :(得分:0)

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