在单个 MySQL 查询中使用多个临时表(适用于 phpMyAdmin,但不适用于 PHP)

Posted

技术标签:

【中文标题】在单个 MySQL 查询中使用多个临时表(适用于 phpMyAdmin,但不适用于 PHP)【英文标题】:Using multiple temporary tables in a single MySQL query (works in phpMyAdmin, but not PHP) 【发布时间】:2014-03-21 09:28:36 【问题描述】:

我想避免使用真实表格作为解决方法。我正在尝试加入两个表并为我调用的列获取唯一值unique_values_needed,同时当值 11 重复出现时优先考虑值 11real_secondary_table_primary_key

这是代码(它在 phpMyAdmin 中有效,但在 PHP 中无效):

如果不存在则创建临时表temporary_table_1 AS (选择 real_main_table.*, real_secondary_table.real_secondary_table_primary_key FROM real_main_table 左连接 real_secondary_table ON real_secondary_table.real_main_table_primary_key = real_main_table.real_main_table_primary_key ORDER BY real_main_table.date DESC); 如果不存在则创建临时表temporary_table_2 AS (选择 real_main_table.*, real_secondary_table.real_secondary_table_primary_key FROM real_main_table 左连接 real_secondary_table ON real_secondary_table.real_main_table_primary_key = real_main_table.real_main_table_primary_key ORDER BY real_main_table.date DESC); 更新temporary_table_1 t1,temporary_table_2 t2 SET t1.real_secondary_table_primary_key = t2.real_secondary_table_primary_key WHERE t1.real_main_table_primary_key = t2.real_main_table_primary_key AND t1.real_secondary_table_primary_key 11 AND t2.real_secondary_table_primary_key = 11; 选择 * FROM 临时表 1 GROUP BY unique_values_needed 按temporary_table_1.date DESC排序;

我也尝试了以下方法(同样,它在 phpMyAdmin 中有效,但在 PHP 中仍然无效):

如果不存在则创建临时表temporary_table_1 AS (选择 real_main_table.*, real_secondary_table.real_secondary_table_primary_key FROM real_main_table 左连接 real_secondary_table ON real_secondary_table.real_main_table_primary_key = real_main_table.real_main_table_primary_key ORDER BY real_main_table.date DESC); 更新temporary_table_1 t1,( 选择 real_main_table.*, real_secondary_table.real_secondary_table_primary_key FROM real_main_table 左连接 real_secondary_table ON real_secondary_table.real_main_table_primary_key = real_main_table.real_main_table_primary_key ORDER BY real_main_table.date DESC) t2 SET t1.real_secondary_table_primary_key = t2.real_secondary_table_primary_key WHERE t1.real_main_table_primary_key = t2.real_main_table_primary_key AND t1.real_secondary_table_primary_key 11 AND t2.real_secondary_table_primary_key = 11; 选择 * FROM 临时表 1 GROUP BY unique_values_needed 按temporary_table_1.date DESC排序;

当我使用mysql_query($query) or die(mysql_error()) 检查时,错误应该是在创建第二个临时表时(在第一个代码示例中),或者在UPDATE 中使用(SELECT ...) t2(在第二个代码示例中)。

【问题讨论】:

提供SHOW CREATE TABLE real_main_table;SHOW CREATE TABLE real_secondary_table; 和所需的输出。还有read this 我很困惑——这不只是输出制作表格所需的 SQL 吗?你想让我把表格贴在这里吗?编辑:没关系,我看到你的问题已经澄清了。 你确定你从 php 端使用相同的连接(会话)到 db 吗?还发布您收到的错误 mysql_query 应该只执行一条语句。您应该使用 mysqli_multi_query ,抱歉我不知道 mysql_* 等价物。 已弃用:mysql 扩展已弃用,将来将被删除:使用 mysqli 或 PDO 【参考方案1】:

您不能使用mysql_query() 执行多个查询,您应该使用mysqli_multi_query 来执行此操作。 mysql_* 函数中没有与 mysqli_multi_query 等效的函数。

您可以在同一代码中同时使用mysql_*mysqli_*,但请注意不要将它们混淆起来,例如 open 与 mysql_open() 并使用 mysqli_query() 查询,反之亦然。使用mysqli_open() 打开连接后,您应该只在该连接上使用mysqli_* 函数。这也适用于mysql_* 连接。但是您可以使用相同的代码同时打开两个连接。

警告: mysql_ 函数自 PHP 5.5.0 起已弃用,将来将被删除。相反,应使用 MySQLi 或 PDO_MySQL 扩展名。

【讨论】:

以上是关于在单个 MySQL 查询中使用多个临时表(适用于 phpMyAdmin,但不适用于 PHP)的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询一次在单个查询中在多个表中插入记录

MySQL ----- 组合查询 UNION(十五)

MySQL ----- 组合查询 UNION(十五)

使用 bigquery 和单个查询进行分区,根据日期将表拆分为多个表

[MySQL]select和where子句优化

单个查询中的 Postgresql 多个连接,其中连接的外键不存在于所有表中