Mysql 下面的SQL语句过去是有效的,但现在我得到一个未知列错误,我知道该列存在

Mysql 下面的SQL语句过去是有效的,但现在我得到一个未知列错误,我知道该列存在,mysql,sql,Mysql,Sql,我最初并没有编写这段代码,但它曾经工作过。不幸的是,它已经不起作用了。我的研究表明,这是SQL类型的不匹配,但我对SQL不够精通,无法修复错误。希望这里有人能指点我 SELECT DISTINCT (`users`.`card_id` ) AS `card_id2` , `users` .`firstname` AS `First Name` , `users`.`lastname` AS `Last Name` , `users`.`card_id` AS `Card ID` , `users

我最初并没有编写这段代码,但它曾经工作过。不幸的是,它已经不起作用了。我的研究表明,这是SQL类型的不匹配,但我对SQL不够精通,无法修复错误。希望这里有人能指点我

SELECT DISTINCT (`users`.`card_id` ) AS `card_id2`
, `users` .`firstname` AS `First Name`
, `users`.`lastname` AS `Last Name`
, `users`.`card_id` AS `Card ID`
, `users`.`address1` AS `Address`
, `users`.`address2` AS `Address2`
, `users`.`city` AS `City`
, `users`.`state` AS `State`
, `users`.`zip` AS `Zip`
, `users`.`email` AS `Email`
, `users`.`phone_area`
, `users`.`phone_exchange`
, `users`.`phone_number`
, `trans`.`trans_dt` AS `Last Trans Date`
, `trans`.`credit_balance` AS `Credit Balance`
, `trans`.`balance` AS `Gift Balance`
, `users`.`gender` AS `Gender`
, `users`.`birthdate` AS `Birthday (Age)`
, `users`.`register_dt` AS `Registration Date`
, `merchants`.`company`
, `merchants`.`merchantkey`FROM `trans`
, `users`
, (SELECT `card_id`, max( `trans_id` ) AS `trans_dt` 
   FROM `trans` 
   WHERE `trans`.`trans_type` >0 GROUP BY `card_id`
) AS `trans_max` 
LEFT JOIN `merchants` ON `merchants`.`merchantkey`=`trans`.`merchantkey` 
WHERE trans.card_id = users.card_id 
AND trans.card_id = trans_max.card_id 
AND trans.trans_id = trans_max.trans_dt 
ORDER BY users.lastname, users.firstname;



Error Code: 1054. Unknown column 'trans.merchantkey' in 'on clause'

我在上面复制并粘贴您的查询。FROM子句的
位置错误。
商户。merchantkey
和来自trans的
之间没有空格。为什么在FROM
子句的
之后还有一些
SELECT
子句,然后是
LEFT JOIN

SELECT DISTINCT ...
, `merchants`.`company`
, `merchants`.`merchantkey`FROM `trans`
, `users`
, (SELECT `card_id`, max( `trans_id` ) AS `trans_dt` 
   FROM `trans` 
   WHERE `trans`.`trans_type` >0 GROUP BY `card_id`
) AS `trans_max` 
LEFT JOIN `merchants` ON `merchants`.`merchantkey`=`trans`.`merchantkey`
...
我觉得你的
不合适。尝试将
FROM
子句移动到
左连接之前

SELECT DISTINCT (`users`.`card_id` ) AS `card_id2`
    , `users` .`firstname` AS `First Name`
    , `users`.`lastname` AS `Last Name`
    , `users`.`card_id` AS `Card ID`
    , `users`.`address1` AS `Address`
    , `users`.`address2` AS `Address2`
    , `users`.`city` AS `City`
    , `users`.`state` AS `State`
    , `users`.`zip` AS `Zip`
    , `users`.`email` AS `Email`
    , `users`.`phone_area`
    , `users`.`phone_exchange`
    , `users`.`phone_number`
    , `trans`.`trans_dt` AS `Last Trans Date`
    , `trans`.`credit_balance` AS `Credit Balance`
    , `trans`.`balance` AS `Gift Balance`
    , `users`.`gender` AS `Gender`
    , `users`.`birthdate` AS `Birthday (Age)`
    , `users`.`register_dt` AS `Registration Date`
    , `merchants`.`company`
    , `merchants`.`merchantkey
    , `users`
    , (
        SELECT `card_id`, max( `trans_id` ) AS `trans_dt` 
        FROM `trans` 
        WHERE `trans`.`trans_type` >0 GROUP BY `card_id`
    ) AS `trans_max` 
FROM `trans`
LEFT JOIN `merchants` ON `merchants`.`merchantkey`=`trans`.`merchantkey`
WHERE trans.card_id = users.card_id 
    AND trans.card_id = trans_max.card_id 
    AND trans.trans_id = trans_max.trans_dt 
ORDER BY users.lastname, users.firstname;

该错误表明您的
trans
表中实际上没有
merchantkey
字段。我认为您确实有该字段,错误是由混合联接样式引起的。您已经得到了不推荐的ANSI-89样式(
来自tablea,tableb其中a.key=b.key
)以及正确的ANSI-92样式(
来自tablea,在a.key=b.key上连接tableb
)。两者都独立工作,但混合使用会产生优先级问题,因为ANSI-92样式联接在ANSI-89样式联接之前进行计算。此优先级问题会产生错误,因为您在
左联接中引用了一个尚未计算的字段。切换到所有正确的ANSI-92样式联接是一种良好的做法,应该可以修复错误:

SELECT DISTINCT (users.card_id ) AS card_id2
, users .firstname AS `First Name`
, users.lastname AS `Last Name`
, users.card_id AS `Card ID`
, users.address1 AS Address
, users.address2 AS Address2
, users.city AS City
, users.state AS State
, users.zip AS Zip
, users.email AS Email
, users.phone_area
, users.phone_exchange
, users.phone_number
, trans.trans_dt AS `Last Trans Date`
, trans.credit_balance AS `Credit Balance`
, trans.balance AS `Gift Balance`
, users.gender AS Gender
, users.birthdate AS `Birthday (Age)`
, users.register_dt AS `Registration Date`
, merchants.company
, merchants.merchantkey
FROM trans 
JOIN users 
  ON    trans.card_id = users.card_id 
JOIN (SELECT card_id
            , max( trans_id ) AS trans_dt
      FROM trans
      WHERE trans.trans_type > 0 
      GROUP BY card_id
    ) AS trans_max
  ON    trans.card_id = trans_max.card_id 
   AND  trans.trans_id = trans_max.trans_dt  
LEFT JOIN merchants 
  ON     merchants.merchantkey = trans.merchantkey  
ORDER BY users.lastname, users.firstname;
MySql文档:

以前,逗号运算符(,)和JOIN都具有相同的 优先级,因此连接表达式t1,t2连接t3被解释为 ((t1,t2)连接t3)。现在JOIN具有更高的优先级,因此表达式 被解释为(t1,(t2和t3))。这一变化会影响语句 使用ON子句,因为该子句只能引用列 在联接的操作数中,优先级的更改也会更改 解释这些操作数是什么


看起来这个优先级问题并不总是存在的,但它可能已经在MySQL 5.7中引入,因此如果查询以前有效,可能是因为它以前在早期版本上运行。

我感到困惑。这是SQL Server还是MySQL?MySQL还是SQL Server?是哪一个?你能添加实际的错误堆栈跟踪吗?我已经删除了标记。它一定是MySQL,因为有倒勾。我得到一个关于未知列的错误,但我“我不会告诉你它是哪一个,也不会向你展示我的数据库模式。你能涉过这乱七八糟的局面,试着把它弄清楚吗?错误消息会准确地告诉您它无法识别的列;你为什么这么粗鲁,没有提供信息就向我们求助?您要求我们提供免费帮助来解决您的问题-您至少可以将屏幕上的信息告诉我们。
users
是另一个表,它是使用不推荐的联接语法的以逗号分隔的表/子查询列表,然后是适当的联接。@Eric,谢谢你的建议。我尝试了您编写的代码,在括号中的SELECT语句中出现了一个通用SQL语法错误。然后我调整了你的代码,在前面提到的SELECT错误之前移动孤立的“用户”,并将其放在FROM语句中,但语法错误仍然存在。我不确定,但是我相信括号内的SELECT语句是从中创建一个临时表,我正在选择一些东西,这就是为什么它位于from语句之后。正如我所说,我没有编写这段代码,它远远超出了我所熟悉的SQL级别。顺便说一句,merchants.merchantkey和FROM trans之间的空格对初始代码没有影响。非常感谢,在我将一些引号添加到多字字段名后,这段代码非常有效。我曾看到另一篇文章告诉我,问题在于ANSI不匹配,但我没有完全理解它,也没有修复它的专业知识。非常感谢您的专业知识。当我进行了一次清除背虱的疯狂活动时,我没有注意到这些字段,很高兴为您提供帮助。