我正在建立一个“标签”系统。我引用它是因为它不是一个标记系统,但是足够接近。

显然,在处理标签时,用户可能会很好地使用多个标签,并期望将结果过滤到更大的深度。

我遇到的问题是如何确切地做到这一点。

到目前为止,我有2种方法可以考虑这样做,但是如果有人可以解释正确的方法,我将不胜感激。

方式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


有一个更好的方法吗?

最佳答案

这三个表的数据库结构很好。但是您的查询有一个小问题。你不是一种语法。让我们举个例子。用户搜索带有标签“ a”和“ b”的内容。如果您的内容仅带有标签“ a”,则会出现该结果。也只带有“ b”标签的内容。您应该追加查询内容,例如:

拥有COUNT(t.tag_id)= x

,其中x是用于查询的标签数的长度(在我的示例2中,在您的示例3中)。如果给定集合的所有项目都匹配,则将内容视为结果。仅当这些表中没有重复的条目时,此方法才有效。

另外,请使用内爆代替循环。

$string = implode(",", $tagarray);


这样,您无需费心删除最后一个逗号。

关于php - 根据动态条件查询数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9840846/

10-11 02:53