【问题标题】:Unknown column in 'having clause' in mysql 5.5mysql 5.5 中“有子句”中的未知列
【发布时间】:2019-05-07 03:25:21
【问题描述】:

我尝试运行具有以下条件的查询:

        SELECT 
            `doctors`.*,
            (
                SELECT GROUP_CONCAT(`areas`.`areaName` SEPARATOR ', ')
                FROM `areas_has_doctors`
                INNER JOIN `areas` ON `areas`.`areaId` = `areas_has_doctors`.`areaId`
                WHERE `areas_has_doctors`.`doctorId` = `doctors`.`doctorId`
            ) as `areas`,
            (
                SELECT GROUP_CONCAT(`areas`.`areaId`)
                FROM `areas_has_doctors`
                INNER JOIN `areas` ON `areas`.`areaId` = `areas_has_doctors`.`areaId`
                WHERE `areas_has_doctors`.`doctorId` = `doctors`.`doctorId`
            ) as `areasIdies`
        FROM 
            `cats_has_doctors`
            INNER JOIN `doctors` ON `doctors`.`doctorId` = `cats_has_doctors`.`doctorId` 
        WHERE 
            `cats_has_doctors`.`catId` = '1' && `doctors`.`disable` = 0
        GROUP BY 
            `cats_has_doctors`.`relationId`
         HAVING FIND_IN_SET('1,2,3,4', `areasIdies`)

带有10.0.21-MariaDB - MariaDB 服务器的服务器正在工作 但在服务器中:

5.5.61-cll - MySQL Community Server (GPL)

我得到了错误:

Unknown column 'areasIdies' in 'having clause'

我能做什么?

【问题讨论】:

  • HAVING 部分早于SELECT 应用。将原始查询替换为别名。
  • "HAVING 部分早于 SELECT" @revo 不确定你的意思我假设你的意思是 HAVING 不能使用来自同一个 SELECT 查询的别名?如果这就是你的意思,那你就错了。
  • 基本上,HAVING 不能与别名相处...你需要指定一个 HAVING + full subquery 或将所有内容都包含在一个大查询中,然后使用 have in最终输出(可能会影响 mySQL 的优化计划)
  • FIND_IN_SET 倒退:针先来,草垛次之。或者您正在尝试不可能的事情:检查多个键。
  • HAVING 条件中的反引号 (`) 的解释似乎存在错误,仅限 MySQL 5.5。见db-fiddle

标签: mysql mariadb having


【解决方案1】:

也许它认为 areaIdies 是一个变量?

我会尝试将 areaIdies 子查询拉入临时表并尝试。 只需将查询保持原样进行测试,但只需在顶部执行此操作并更改 set 参数中的查找。

CREATE TEMPORARY TABLE IF NOT EXISTS areasIdiesTemp AS (
    SELECT GROUP_CONCAT(`areas`.`areaId`)
    FROM `areas_has_doctors`
    INNER JOIN `areas` 
    ON `areas`.`areaId` = `areas_has_doctors`.`areaId`
    WHERE `areas_has_doctors`.`doctorId` = `doctors`.`doctorId`
);

SELECT 
    `doctors`.*,
    (
        SELECT GROUP_CONCAT(`areas`.`areaName` SEPARATOR ', ')
        FROM `areas_has_doctors`
        INNER JOIN `areas` ON `areas`.`areaId` = `areas_has_doctors`.`areaId`
        WHERE `areas_has_doctors`.`doctorId` = `doctors`.`doctorId`
    ) as `areas`,
    (
        SELECT GROUP_CONCAT(`areas`.`areaId`)
        FROM `areas_has_doctors`
        INNER JOIN `areas` ON `areas`.`areaId` = `areas_has_doctors`.`areaId`
        WHERE `areas_has_doctors`.`doctorId` = `doctors`.`doctorId`
    ) as `areasIdies`
FROM 
    `cats_has_doctors`
    INNER JOIN `doctors` ON `doctors`.`doctorId` = `cats_has_doctors`.`doctorId` 
WHERE 
    `cats_has_doctors`.`catId` = '1' && `doctors`.`disable` = 0
GROUP BY 
    `cats_has_doctors`.`relationId`
HAVING FIND_IN_SET('1,2,3,4', `areasIdiesTemp`);

【讨论】:

  • 当然,我会重构它以使用临时表,但没有数据集我无法完全测试,所以上帝的速度。
猜你喜欢
  • 2011-05-03
  • 2021-09-19
  • 2018-04-01
  • 1970-01-01
  • 2017-06-05
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多