3

我正在尝试加入几个表,但我的加入语句失败了。我相信这是因为第二个连接中的列名是“名称”,也许 MySQL 认为我正在尝试访问一个属性?我怎样才能解决这个问题?

SELECT surgery_city.*, s.surgeon_type, st.abbrev
FROM surgery_city 
LEFT JOIN surgery_key as s ON s.surg_id = treatment_id 
LEFT JOIN states as st ON st.name = surgery_city.state
WHERE treatment_id='10001'

问题是我引用 st.name 的第二个左连接 - 关于如何正确引用该列的任何想法?不幸的是,此时更改表中的列名不是一个选项:(..

谢谢,

银虎

更新:

我在上面的查询中得到的错误是:

[Err] 1267 - 非法混合排序规则 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) 用于操作 '='

当我用反引号包围该字段时,我得到以下信息:

LEFT JOIN states as st ON `st.name` = seo_surgery_city.state

我得到以下信息:

[Err] 1054 - “on 子句”中的未知列“st.name”

它也失败了

LEFT JOIN states as st ON st.`name` = seo_surgery_city.state

(单引号=那里的反勾号,但在这里不会正确显示)

[Err] 1267 - 非法混合排序规则 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) 用于操作 '='

也失败了

LEFT JOIN states as st ON `st`.`name` = seo_surgery_city.state

[Err] 1267 - 非法混合排序规则 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) 用于操作 '='

4

4 回答 4

1

尝试将列名放在反引号中,例如st.name. 请参阅文档

于 2012-01-17T16:10:16.900 回答
1

您应该使用反引号包含列名称:

st.`name`

UPD

问题是列有不同的排序规则,请尝试以下操作:

SELECT surgery_city.*, s.surgeon_type, st.abbrev
FROM surgery_city 
LEFT JOIN surgery_key as s ON s.surg_id = treatment_id 
LEFT JOIN states as st ON st.name = (surgery_city.state COLLATE utf8_unicode_ci)
WHERE treatment_id='10001'

但要解决此问题,您应该更新其中一列的排序规则:states.nameseo_surgery_city.state. 他们都应该有utf8_general_ci

于 2012-01-17T16:12:44.717 回答
1

您应该对所有表和列使用相同的排序规则和字符集。如果您不知道要使用什么排序规则,请使用utf8_general_ciutf8字符集。

ALTER TABLE seo_surgery_city CONVERT TO CHARACTER SET utf8 COLLATE 'utf8_general_ci';
ALTER TABLE seo_surgery_key CONVERT TO CHARACTER SET utf8 COLLATE 'utf8_general_ci';
ALTER TABLE states CONVERT TO CHARACTER SET utf8 COLLATE 'utf8_general_ci';
于 2012-01-17T16:20:19.820 回答
0

2022 年更新:

关键字“名称”现在列在 MySQL 官方文档的“关键字和保留字”列表中。您可以在那里找到所有保留字。

参考:https ://dev.mysql.com/doc/refman/8.0/en/keywords.html#keywords-8-0-detailed-N

于 2022-02-07T10:44:44.633 回答