【问题标题】:MySQL gives me "unknown column" error on WindowsMySQL 在 Windows 上给了我“未知列”错误
【发布时间】:2021-06-10 13:33:19
【问题描述】:

我使用 MySQL 在 Node.Js 上执行了以下查询:

SELECT COUNT(DISTINCT t.uid) AS usersCount, COUNT(*) AS workingDaysCount
    FROM (
    SELECT d.date, u.id AS uid,
        CASE TIMESTAMPDIFF(day, SUBDATE(d.date, WEEKDAY(d.date)), d.date)
            WHEN 0 THEN w.monday
            WHEN 1 THEN w.tuesday
            WHEN 2 THEN w.wednesday
            WHEN 3 THEN w.thursday
            WHEN 4 THEN w.friday
            WHEN 5 THEN w.saturday
            WHEN 6 THEN w.sunday
            ELSE NULL
        END AS working_day
    FROM (
    SELECT date_range.date
    FROM (
        SELECT CURDATE() - INTERVAL (sign.a * (a.a + (10 * b.a) + (100 * c.a) + (1000 * e.a) )) DAY AS date
        FROM (SELECT -1 AS a UNION ALL SELECT 1) AS sign
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS e
        ORDER BY date DESC
    ) date_range
    WHERE date_range.Date BETWEEN DATE('2021-06-10') AND DATE('2021-06-10')) d, users u
        LEFT OUTER JOIN working_days w ON w.id = (
            SELECT id
            FROM working_days
            WHERE user_id = u.id AND week_start_date <= d.date
            ORDER BY week_start_date DESC
            LIMIT 1
        )
    WHERE u.id IN (4)
    GROUP BY d.date, u.id
) t
    WHERE t.working_day = 1;

在 Linux 服务器上它工作正常,所以我不知道问题出在哪里,但在 Windows 上我有以下错误:

#1054 - Unknown column 'd.date' in 'where clause'

我已经查看了代码并调试了几个小时,但我没有找到任何关于此的答案。请问有人有什么想法吗?

【问题讨论】:

  • 也许我遗漏了一些东西,但我没有看到表别名 d 的定义。 MySQL 会同意这一点,我应该注意。
  • @GordonLinoff 我想这应该像别名 WHERE date_range.Date BETWEEN DATE('2021-06-10') AND DATE('2021-06-10')) d, users u
  • DISTINCT 不是一个函数,它是一个集合量词!跳过那些多余的括号,直接写COUNT(DISTINCT t.uid) 让代码更清晰。
  • LEFT OUTER JOINON 子句只能访问uw 列。当您混合使用显式 JOIN 和隐式的逗号分隔连接时,就会发生这种情况。到处切换到显式JOIN,问题就消失了!
  • 顺便说一句,您的 Windows MySQL 版本可能比 Linux 版本新,并且该行为已得到纠正。

标签: javascript mysql sql node.js


【解决方案1】:

问题点在于用逗号和 JOIN 组合笛卡尔。

别名为t 的子查询看起来像

SELECT ...
FROM (...) d, u LEFT OUTER JOIN working_days w ...

逗号优先级低于JOIN优先级,因此查询为

SELECT ...
FROM (...) d, ( u LEFT OUTER JOIN working_days w ... )

uw 首先加入。当然,此时子查询d是不可访问的。

用 CROSS JOIN 替换逗号:

SELECT ...
FROM (...) d
CROSS JOIN u 
LEFT OUTER JOIN working_days w ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多