gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:07:22 32 4
gpt4 key购买 nike

我在计算查询时遇到问题。我已经尝试过子查询、不同的连接和 group_concat(),但它们要么不起作用,要么非常慢。这可能解释起来有点复杂,但问题是:

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

我正在使用标签来定义产品的特征,例如颜色、兼容性、产品是否特价等。现在如果我希望能够显示分配有特定标签的产品,我使用一个简单的查询,如:

select * from item, tagassign 
where item.itemid = tagassign.itemid
and tagassign.tagid = "specialoffer"

问题是,我可能想查看具有多个标签的项目。例如,我可能只想查看与 Apple iPhone 兼容的全新黑色手机壳。所以我基本上想查看 item 表中的所有记录,这些记录具有标签“black”和“case”以及“iphone”和“new”。我能让它工作的唯一方法是创建 4 个别名(select * from item, tagassign, tagassign as t1, tagassign as t2, tagassign as t3 等)。在某些情况下,我可能要查找 10 或 20 个不同的标签,而对于那么多的记录,查询速度非常慢。

我知道我遗漏了一些明显的东西。有任何想法吗?谢谢!

最佳答案

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) 上建立唯一索引。

关于mysql select - 子查询,group_concat() 不工作/太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3604076/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com