根据动态数量的条件查询数据库

时间:2012-03-23 14:21:16

标签: php mysql database-design

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

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

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

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

方式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个用于标签,另一个用于连接它们。

这正是我正在做的事情:我用变量代替'beach','cloud','waves'。然后,在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

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

这3个表的数据库结构很好。但是你的查询有点问题。你不是语法。我们来举个例子吧。用户搜索带有标签“a”和“b”的内容。如果您的内容仅包含标记“a”,则会显示结果。也只有'b'标签的内容。您应该追加查询类似的内容:

有COUNT(t.tag_id)= x

,其中x是您要查询的标签数量的长度(在我的示例2中,在您的3中)。这样,如果给定集合的所有项目都匹配,则将内容视为结果。这仅适用于任何这些表中没有重复条目的情况。

另外,使用implode而不是循环。

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

这样您就不需要去除最后一个逗号。