我现在正忙于实现一个过滤器,我需要为每个要过滤的“标签”生成一个内部连接子句。
问题是,在执行了一大堆SQL之后,我有了一个表,其中包含了进行选择所需的所有信息,但每次生成的内部连接都需要它
这基本上看起来是这样的:
SELECT
*
FROM search
INNER JOIN search f1 ON f1.baseID = search.baseID AND f1.condition = condition1
INNER JOIN search f2 ON f2.baseID = search.baseID AND f2.condition = condition2
...
INNER JOIN search fN ON fN.baseID = search.baseID AND fN.condition = conditionN
这是可行的,但我更希望“搜索”表是临时的(如果它不是一个普通的表,它可以小几个数量级),但这给了我一个非常恼人的错误:Can't reopen table
一些研究将我引向this bug report,但是MySQL的人似乎并不关心这样的基本特性(多次使用表)不适用于临时表。我在这个问题上遇到了很多可伸缩性问题。
有没有可行的解决办法,不需要我管理大量可能的临时但非常真实的表,或者让我维护一个包含所有数据的巨型表?
致以良好的问候,克里斯
附加内容
GROUP_CONCAT答案在我的情况下不起作用,因为我的条件是按特定顺序的多个列,它会使我需要为AND的内容进行OR运算。但是,它确实帮助我解决了之前的一个问题,所以现在不再需要表,不管是不是temp。我们只是认为对于我们的问题来说太通用了。滤镜的整个应用现在已经从大约一分钟恢复到不到四分之一秒。
发布于 2020-05-25 13:31:54
如果切换到MariaDB (MySQL的一个分支)是可行的--从版本10.2.1:https://jira.mariadb.org/browse/MDEV-5535开始,这个麻烦就被修复了。
发布于 2013-01-28 18:28:00
一个简单的解决方案是复制临时表。如果表相对较小,则效果很好,临时表通常就是这种情况。
发布于 2008-12-07 06:03:12
没错,MySQL docs说:“您不能在同一查询中多次引用TEMPORARY
表。”
下面是另一个查询,它应该找到相同的行,虽然匹配行的所有条件不会在单独的列中,但它们将在逗号分隔的列表中。
SELECT f1.baseID, GROUP_CONCAT(f1.condition)
FROM search f1
WHERE f1.condition IN (<condition1>, <condition2>, ... <conditionN>)
GROUP BY f1.baseID
HAVING COUNT(*) = <N>;
https://stackoverflow.com/questions/343402
复制相似问题