我有三个表,它们目前的结构如下
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 在标题中成功。
任何想法都会很棒
再次感谢
最佳答案
我想你最终会是这个——
- 所有 OR 的一个 INNER JOIN。
- 一个 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/