gpt4 book ai didi

mysql - 跨多行匹配,无需太多连接

转载 作者:行者123 更新时间:2023-11-29 13:36:14 24 4
gpt4 key购买 nike

随着数据库的增长,我的特定部分遇到了性能问题。我有一个类似的表:

itemID | name   | value
2 | action | throw
1 | thing | ball
3 | looks | dumb
2 | thing | stick
3 | thing | rock
1 | action | hit
4 | looks | grey
1 | action | wedge
3 | action | throw

我需要查询此表以查找与多个名称相匹配的项目 ID,这些名称具有一个或多个名称 (AND) 与一个或一个或多个值 (OR)。到目前为止,我已经用 OR 完成了这个任务:

SELECT t1.id FROM features as t1
LEFT JOIN features as t2 on t1.id = t2.id
WHERE
(
(t1.`name` = 'thing' AND t1.`value` LIKE 'ball')
OR (t1.`name` = 'thing' AND t1.`value` LIKE 'stick')
)
AND
(
t2.`name` = 'action'
AND (t2.`value` LIKE 'hit' OR t2.`value` LIKE 'thro%')
)

*请注意,在此示例中,每个名称都有 2 个值,但可以是任意数字。我有this sqlFiddle如果它有助于澄清。

这在一段时间内工作得很好,但随着系统的发展,这些表变得越来越大(有时超过 400 万行),而且更成问题的是,在它们上运行的查询必须包含许多名称/值集。在第 4 次 JOIN 后,性能急剧下降,到 9 次时,执行查询可能需要一分钟多的时间。我还遇到过查询在 STATISTICS 步骤中卡住几个小时的问题,我已通过将优化器深度设置为 1 来解决这个问题,但这并不理想。

如何在没有这么多连接的情况下执行此查询?

编辑:当我提出问题时,我错过了其中一个要求(周一的情况)。值列中的查询值需要不区分大小写,并且可以使用通配符。我相应地编辑了我的查询示例。

最佳答案

像这样怎么样

SELECT id 
FROM features f
group by name
having sum(name = 'thing' and value in ('ball', 'stick')) > 0
or sum(name = 'action' and value in ('hit', 'throw')) > 0

SQLFiddle demo

关于mysql - 跨多行匹配,无需太多连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18703481/

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