【问题标题】:MYSQL alias in subquery where clause子查询where子句中的MYSQL别名
【发布时间】:2015-12-06 12:03:10
【问题描述】:

我对子查询中的别名有疑问。

我有一个问题:

SELECT
    `id` as `t`, 
    `title`, 
    `once`,
    (select count(`id`) from `orders_files` where `order_id`='116815' and `type`=`t` and (`version`='41924') ) as `count`,
    (select count(`id`) from `orders_files` where `order_id`='116815' and `type`=`t` ) as `count_in_order`
FROM 
    `orders_filetypes`
WHERE
    `required`=1 
ORDER BY `sort`, `title`

可在旧版本的 mysql (5.6.22) 上运行和工作,但不能在新版本的 mysql (5.7.9) 上运行。 mysql 错误是“#1054 - 'where 子句'中的未知列 't'”。

配置文件一模一样,问题是什么我不明白。

我们更新了 mysql 服务器,许多查询停止工作。 请告诉我,这个功能在较新的 mysql 中已被弃用,或者可以设置 /etc/my.cnf?

不可能找到并修复可以使用此类请求的数十万行代码,因此最好将这种可能性包含在新服务器中。

谢谢!

【问题讨论】:

  • 这是从 5.6 到 5.7 的更改页面,我没有看到任何关于此 dev.mysql.com/doc/refman/5.7/en/… 的确切信息,因为您正在执行 SELECT
  • 可能重复 stackoverflow.com/questions/34003818/…,因为它还有在 5.7 中停止工作的子查询。但它并没有说明如何在不重写的情况下解决它,所以我仍然认为其中一个是一个有效的开放问题。
  • 谢谢你的链接,艾琳,但我的问题没有答案。问题在于更新 mysql 服务器(配置、更改或默认值),而不是错误的查询。 SQL 查询在旧版本的 mysql 上运行良好。
  • 这正是我所说的,不是吗?这仍然是一个悬而未决的问题。问题是查询在 5.7 中的处理方式不同......你能测试一下吗? SET optimizer_switch = 'derived_merge=off'; 这似乎是子查询的主要变化。
  • 如果您在 5.6 和 5.7 中为您的查询运行 EXPLAIN 并发布结果,那将非常有帮助。

标签: mysql


【解决方案1】:

为什么不使用表别名并通过它的名称来调用列,如下所示:

SELECT
        `id` as `t`, 
        `title`, 
        `once`,
        (select count(`id`) from `orders_files` where `order_id`='116815' and `type`=outer_table.`id` and (`version`='41924') ) as `count`,
        (select count(`id`) from `orders_files` where `order_id`='116815' and `type`=outer_table.`id` ) as `count_in_order`
    FROM 
        `orders_filetypes` as outer_table
    WHERE
        `required`=1 
    ORDER BY `sort`, `title`

【讨论】:

  • 没问题,当然可以使用这段代码。但关键是,工作因此而停止。并在程序中搜索数千行代码,其中使用了这样的请求 - 长时间不现实。更改设置的最佳选择,一切都会像以前一样工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多