如果标题不清楚,我很抱歉,我将试着用一个例子来解释。假设我有一个标记为“trees”和“greenery”的文件,我想搜索它,但是当我在输入字段中输入“trees”和“greenery”时,它给我的结果是标记为其中之一或两者。
下面是我的数据库结构:
对于查询,我使用IN操作符,它看起来像这样:SELECT path FROM tagged_files INNER JOIN file_tags ON tagged_files.tag_id=file_tags.id INNER JOIN files ON tagged_files.file_id = files.id WHERE file_tags.tag IN ($inQuery) GROUP BY files.id ORDER BY files.id;
变量$inQuery
定义为:$inQuery = implode(',', array_fill(0, count($tags), '?'));
和$tags
是来自搜索查询的字符串,我稍后绑定这些值。
如何让查询只选择与我输入的所有标记匹配的文件?
1条答案
按热度按时间dgiusagp1#
好了,我想我已经弄明白了,在查询的末尾添加
HAVING COUNT(DISTINCT file_tags.id) = numberOfTags
可以确保所有的词都被考虑在内。这样做的原因是,如果您选择所有带有IN标签的文件(例如“trees”,“greenery”),如果有意义的话,您会得到每个文件带有这些标签的两行。