我在计算查询时遇到了问题。我尝试过子查询、不同的连接和group_concat(),但它们要么不起作用,要么慢得让人痛苦。这可能有点复杂,但问题是:
我有一个表“项目”(大约有2000种产品)。我有一个表“标签”(它包含大约2000个不同的产品标签)。我有一个表"tagassign“(它将标签与项目连接起来,大约有200000条记录)。
我使用标签来定义产品的特征,例如颜色、兼容性、产品是否特价等等。现在,如果我想要显示分配了特定标签的产品,我使用如下简单的查询:
select * from item, tagassign
where item.itemid = tagassign.itemid
and tagassign.tagid = "specialoffer"问题是,我可能想看到有多个标签的项目。例如,我可能只想看到与苹果iPhone兼容并且是新的黑色手机壳。因此,我基本上希望看到item表中的所有记录,这些记录的标签分别是"black“、"case”、"iphone“和"new”。我能让它工作的唯一方法是创建4个别名(select * from item,tagassign,tagassign as t1,tagassign as t2,tagassign as t3等等)。在某些情况下,我可能会寻找10到20个不同的标签,而有了这么多记录,查询速度就慢得可怕。
我知道我漏掉了一些明显的东西。有什么想法吗?谢谢!
发布于 2010-08-31 05:04:50
SELECT *
FROM item i
WHERE (
SELECT COUNT(*)
FROM tagassign ta
WHERE ta.tagid IN ('black', 'case', 'iphone', 'new')
AND ta.itemid = i.itemid
) = 4替换为您要搜索的标记的实际数量,而不是4。
在tagassign (itemid, tagid)上(按此顺序)创建唯一索引或主键,以便快速执行此操作。
如果您正在搜索大量标签(或很少使用的标签),则此查询也可能更快:
SELECT i.*
FROM (
SELECT itemid
FROM tagassign ta
WHERE ta.tagid IN ('black', 'case', 'iphone', 'new')
GROUP BY
itemid
HAVING COUNT(*) = 4
) t
JOIN item i
ON i.itemid = t.itemid对于此查询,您需要tagassign (tagid, itemid)上的唯一索引。
https://stackoverflow.com/questions/3604076
复制相似问题