【问题标题】:Error Code: 1054: Unknown column 'table_name.column_name' in 'field list' when Table exist错误代码:1054:当表存在时,'字段列表'中的未知列'table_name.column_name'
【发布时间】:2021-08-11 17:42:45
【问题描述】:

我正在尝试运行 mySQL 查询以从我的数据库中获取数据。以下是我的查询:

SELECT user,
      SUM(CASE WHEN sub_status = 'TB' THEN pause_sec END) AS Training_Break,
      SUM(CASE WHEN sub_status = 'SB1' THEN pause_sec END) AS Short_Break_1,
      SUM(CASE WHEN sub_status = 'SB2' THEN pause_sec END) AS Short_Break_2,
      SUM(CASE WHEN sub_status = 'LB' THEN pause_sec END) AS Long_Break
FROM vicidial_agent_log
WHERE event_time >= '2021-04-01' AND
      event_time < '2021-04-17' AND
      sub_status IN ('TB', 'SB1', 'SB2', 'LB')
GROUP BY user
HAVING COALESCE(`Training Break`, `Short Break 1`, `Short Break 2`, `Long Break`) IS NOT NULL


这会产生预期的结果: Table Output on the results. 我想显示用户的姓名,但他们在另一个表中。所以,我在这里使用 join 如下:


SELECT `vicidial_agent_log.user`,
`vicidial_users.full_name`,
      SUM(CASE WHEN `vicidial_agent_log.sub_status` = 'TB' THEN `vicidial_agent_log.pause_sec` END) AS Training_Break,
      SUM(CASE WHEN `vicidial_agent_log.sub_status` = 'SB1' THEN `vicidial_agent_log.pause_sec` END) AS Short_Break_1,
      SUM(CASE WHEN `vicidial_agent_log.sub_status` = 'SB2' THEN `vicidial_agent_log.pause_sec` END) AS Short_Break_2,
      SUM(CASE WHEN `vicidial_agent_log.sub_status` = 'LB' THEN `vicidial_agent_log.pause_sec` END) AS Long_Break
FROM `vicidial_agent_log`
INNER JOIN `vicidial_users` ON `vicidial_users.user`=`vicidial_agent_log.user`
WHERE `vicidial_agent_log.event_time` >= '2021-04-01' AND
      `vicidial_agent_log.event_time` < '2021-04-17' AND
      `vicidial_agent_log.sub_status` IN ('TB', 'SB1', 'SB2', 'LB')
GROUP BY `vicidial_agent_log.user`
HAVING COALESCE(`Training_Break`, `Short_Break_1`, `Short_Break_2`, `Long_Break`) IS NOT NULL

它会产生以下错误:

错误代码:1054 Unknown column 'vicidial_agent_log.user' in 'field list'


但是表存在。
另外,如果我删除代码中的反引号,它会生成此错误:

错误代码:1054 Unknown column 'vicidial_agent_log.user' in 'group statement'


以下是我的两个表及其列的字段:
>vicidial_agent_log 的列:[agent_log_id, user, ...]
>vicidial_users 的列:[user_id, user, pass, full_name, ...]

我想要的输出应该看起来像 https://i.stack.imgur.com/GVeIz.png 只是添加了一个带有名称的列。


这是我的第一个专业项目正在建设中,任何形式的帮助都可以。我一定犯了一个可能很小的初学者错误。我不确定我的逻辑或概念是否有问题。我研究了其他帖子,但它似乎对我不起作用。任何形式的帮助都会大有帮助。

【问题讨论】:

    标签: mysql sql join mariadb


    【解决方案1】:

    不要逃避你的标识符!并使用别名!我想我在之前的回答中提到了这一点。所以:

    SELECT al.user, u.full_name,
          SUM(CASE WHEN al.sub_status = 'TB' THEN al.pause_sec  END) AS Training_Break,
          SUM(CASE WHEN al.sub_status = 'SB1' THEN al.pause_sec END) AS Short_Break_1,
          SUM(CASE WHEN al.sub_status = 'SB2' THEN al.pause_sec END) AS Short_Break_2,
          SUM(CASE WHEN al.sub_status = 'LB' THEN al.pause_sec END) AS Long_Break
    FROM vicidial_agent_log al JOIN
         vicidial_users u
         ON u.user = al.user
    WHERE al.event_time >= '2021-04-01' AND
          al.event_time < '2021-04-17' AND
          al.sub_status IN ('TB', 'SB1', 'SB2', 'LB')
    GROUP BY al.user, u.full_name;
    

    此版本不需要HAVING 子句,除非al.pause_sec 可以是NULL。如果可能,只需将al.pause_sec IS NOT NULL 添加到WHERE 子句。

    您的查询的问题在于

    `vicidial_agent_log.user`
    

    指的是其中包含. 的列名。你打算:

    `vicidial_agent_log`.`user`
    

    但是当反引号相当于:

    vicidial_agent_log.user
    

    或者:

    al.user
    

    当表别名被定义时。

    【讨论】:

    • 谢谢你,你的解释让它看起来很简单。我绝对会将您的 cmets 放在我的 OneNote 文件中。
    猜你喜欢
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    相关资源
    最近更新 更多