首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql select -子查询,group_concat()不工作/太慢

mysql select -子查询,group_concat()不工作/太慢
EN

Stack Overflow用户
提问于 2010-08-31 04:39:48
回答 1查看 895关注 0票数 2

我在计算查询时遇到了问题。我尝试过子查询、不同的连接和group_concat(),但它们要么不起作用,要么慢得让人痛苦。这可能有点复杂,但问题是:

我有一个表“项目”(大约有2000种产品)。我有一个表“标签”(它包含大约2000个不同的产品标签)。我有一个表"tagassign“(它将标签与项目连接起来,大约有200000条记录)。

我使用标签来定义产品的特征,例如颜色、兼容性、产品是否特价等等。现在,如果我想要显示分配了特定标签的产品,我使用如下简单的查询:

代码语言:javascript
复制
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个不同的标签,而有了这么多记录,查询速度就慢得可怕。

我知道我漏掉了一些明显的东西。有什么想法吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-31 05:04:50

代码语言:javascript
复制
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)上(按此顺序)创建唯一索引或主键,以便快速执行此操作。

如果您正在搜索大量标签(或很少使用的标签),则此查询也可能更快:

代码语言:javascript
复制
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)上的唯一索引。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3604076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档