如何按标签检索产品(SQL问题)

时间:2010-12-14 04:26:34

标签: sql mysql stored-procedures

我有两个MySQL表:

  • 产品具有 ID 标题价格以及其他一些产品属性
  • 标记包含* product_id *和* tag_name * fields

每个产品行可以通过* product_id *字段加入表标记中的一行或多行。 问题:如何通过* tag_name *和其他属性选择产品? 示例:我需要选择价格低于10美元的所有书籍并标记为“外国”和“科幻”

我知道如何选择带有一个标签的产品(通过* product_id *加入产品和标签并设置where子句) 我知道如何使用存储过程选择具有多个标记的产品,但查询需要很长时间才能运行。 有没有办法避免存储过程并仍然得到结果?

更新:当您点击右侧栏上的“相关标签”时,StackOverflow会执行类似的操作。现在,我不知道他们的数据库有什么样的架构,但结果很快就选择了用多个标签标记的所有问题。

3 个答案:

答案 0 :(得分:1)

这将返回价格低于10且标签为 foreign sci-fi

的任何产品

这样的东西
SELECT  p.*
FROM    product p
WHERE   p.price < 10
AND     EXISTS  (
                    SELECT  1
                    FROM    tag t
                    WHERE   p.id = t.product_id
                    AND     t.tag_name IN ('foreign','sci-fi')
                )

这将确保它具有两个标记,假设标记具有主键product_id和tag_name

SELECT  p.*
FROM    product p
WHERE   p.price < 10
AND     EXISTS  (
                    SELECT  1
                    FROM    tag t
                    WHERE   p.id = t.product_id
                    AND     t.tag_name IN ('foreign','sci-fi')
                    HAVING COUNT(1) = 2
                )

答案 1 :(得分:0)

如果问题正确的话,这似乎是简单的查询。

我看到的是:

Select Product.* 
from Product, Tag
where Product.id = Tag.product_id
and Product.price<$10
and tag.tag_name in ('foreign', 'sci-fi')

答案 2 :(得分:0)

试,

SELECT p.* FROM products p 
INNER JOIN tag t ON p.id = t.product_id 
WHERE p.price < 10 AND p.id IN( SELECT product_id FROM tag  WHERE  t.tag_name = 'foreign' OR t.tag_name = 'sci-fi' GROUP BY product_id HAVING COUNT(product_id) = 2)