我目前正忙于实现一个过滤器,我需要 for each 要过滤的"标记"生成一个内部连接子句.

问题是,经过一大堆SQL之后,我有一个表,其中包含了我进行 Select 所需的所有信息,但对于生成的每个内部联接,我都需要它

这基本上看起来像:

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答案不起作用,因为我的条件是按特定顺序排列的多个列,它将使我需要的内容成为ORs.然而,它确实帮助我解决了之前的一个问题,所以现在不再需要临时表.我们只是觉得我们的问题太笼统了.过滤器的整个应用现在已经从大约一分钟恢复到不到四分之一秒.

推荐答案

如果切换到MariaDB(MySQL的一个分支)是可行的——从10.2.1:https://jira.mariadb.org/browse/MDEV-5535版开始,这种烦恼就得到了解决.

Mysql相关问答推荐

MySQL INSERT INSERT ON DIPLICATE KEY UPDATE WITH COMPAY PRIMARY KEY失败

将递归 CTE 结果合并到辅助 SQL Select

如何将多个字符串插入变量

根据 JOIN 结果计算列中的值?

SQL使用LIMIT获取结果和结果中的行数

MySQL 使用了错误的索引

如何在更新语句中使用多个子字符串函数?

多个驱动器上的 MYSQL 数据

如何从将分钟、天、月和年存储在不同列中的表中查询数据

巨大的未分区 MySQL 表问题

用数字和字母对 VARCHAR 列进行排序

是否可以在一个查询中将字符串附加到许多匹配的行

我将如何构建一个 SQL 查询来从交易表中 Select 第一次存款、第二次存款和额外存款

在mysql中将纪元数转换为人类可读的日期

如何在mysql select查询中获取两个日期之间的日期列表

MySql 以秒为单位的两个时间戳之间的差异?

使用 mysql 处理非常大的数据

使用 Docker 我收到错误:SQLSTATE[HY000] [2002] 没有这样的文件或目录

如何将数组存储到mysql中?

如果不存在记录,如何 Select sum -or- 0?