我有两个MySQL表:
每个产品行可以通过* product_id *字段加入表标记中的一行或多行。 问题:如何通过* tag_name *和其他属性选择产品? 示例:我需要选择价格低于10美元的所有书籍并标记为“外国”和“科幻”
我知道如何选择带有一个标签的产品(通过* product_id *加入产品和标签并设置where子句) 我知道如何使用存储过程选择具有多个标记的产品,但查询需要很长时间才能运行。 有没有办法避免存储过程并仍然得到结果?
更新:当您点击右侧栏上的“相关标签”时,StackOverflow会执行类似的操作。现在,我不知道他们的数据库有什么样的架构,但结果很快就选择了用多个标签标记的所有问题。
答案 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)