我有三个目前按以下方式构建的表
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在标题中成功。
任何想法都会很棒
再次感谢
答案 0 :(得分:1)
我认为你最终将会是这个 -
例如 -
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;
?>