我现在正忙于实现一个过滤器,我需要为每个要过滤的“标签”生成一个内部连接子句。
问题是,在执行了一大堆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。我们只是认为对于我们的问题来说太通用了。滤镜的整个应用现在已经从大约一分钟恢复到不到四分之一秒。
发布于 2013-01-28 18:28:00
一个简单的解决方案是复制临时表。如果表相对较小,则效果很好,临时表通常就是这种情况。
https://stackoverflow.com/questions/343402
复制相似问题