Mysql 下面的SQL语句过去是有效的,但现在我得到一个未知列错误,我知道该列存在
我最初并没有编写这段代码,但它曾经工作过。不幸的是,它已经不起作用了。我的研究表明,这是SQL类型的不匹配,但我对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
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不匹配,但我没有完全理解它,也没有修复它的专业知识。非常感谢您的专业知识。当我进行了一次清除背虱的疯狂活动时,我没有注意到这些字段,很高兴为您提供帮助。