使用名为“name”的列进行查询

时间:2012-01-17 16:04:13

标签: mysql mysql-error-1267

我正在尝试加入一些表,但是我的加入声明失败了。我相信这是因为第二个连接中的列名是“name”,也许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的第二个左连接 - 关于我如何正确引用该列的任何想法?不幸的是,此时更改表中的列名不是一个选项:(..

谢谢,

Silver Tiger

更新

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

[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 clause'

中的未知列'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)

3 个答案:

答案 0 :(得分:1)

尝试将列名放在反引号中,例如 st.name See the docs

答案 1 :(得分: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

答案 2 :(得分: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';