我正在构建一个“标签”系统。我引用它是因为它不完全是一个标签系统,但足够接近。
显然,在处理标签时,用户很可能会使用多个标签并期望对结果进行更深入的过滤。
我遇到的问题是如何准确地做到这一点。
到目前为止,我可以想到两种方法,但如果有人能解释正确的方法,我将不胜感激。
方式 1) 对每个标签进行单独查询,然后对数据进行排序/组合/播放。 方式2)
SELECT i2t.item_id
FROM Item2Tag i2t
INNER JOIN Tag t
ON i2t.tag_id = t.tag_id
WHERE t.tag_text IN ('beach','cloud','waves')
GROUP BY i2t.item_id
以上是我的查询。这是基于 Toxi 解决方案的修改版本。希望您能明白发生了什么……本质上有 3 个表,1 个用于信息,1 个用于标签,另一个用于连接它们。
这就是我目前正在做的事情:我用变量替换“海滩”、“云”、“波浪”。然后,在 PHP 代码中,我将数组转换为字符串,每个单词用逗号分隔,然后将其插入查询中。所以类似:
foreach ($tagarray as $tag){
$string = .$tag1.", " }
这当然有点过于简化,因为我需要正确地结束最后一个标签而不用逗号..但希望你能明白这一点。
因此,$string 等于 'tag1, tag2, tag3'
SELECT i2t.item_id
FROM Item2Tag i2t
INNER JOIN Tag t
ON i2t.tag_id = t.tag_id
WHERE t.tag_text IN ('$string')
GROUP BY i2t.item_id
有更好的方法吗?
最佳答案
这 3 个表的数据库结构很好。但你的查询有一点问题。你不是一种语法。让我们举个例子。用户搜索带有标签“a”和“b”的内容。如果您的内容仅包含标签“a”,它将作为结果出现。还包含仅带有“b”标签的内容。您应该附加查询,例如:
有 COUNT(t.tag_id) = x
,其中 x 是您正在查询的标签数量的长度(在我的示例中为 2,在您的示例中为 3)。这样,如果给定集合的所有项目都匹配,则内容将被视为结果。仅当这些表中没有重复条目时,此方法才有效。
此外,使用内爆代替循环。
$string = implode(",", $tagarray);
这样您就不需要费心删除最后一个逗号。
关于php - 基于动态数量的条件查询数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9840846/