如果在select中指定大写,则order by子句失败

时间:2016-07-13 11:49:11

标签: php mysql

我有一个类似的查询:

SELECT DISTINCT UPPER(LEFT(title, 1)) as title
 FROM <table_name>
 ORDER BY LEFT(title, 1);

失败,错误

  

#3065 - ORDER BY子句的表达式#1不在SELECT列表中,引用列'title'不在SELECT列表中;这与DISTINCT

不兼容

在按ORDER BY UPPER(LEFT(title, 1));

之类的顺序使用UPPER时,此功能正常

我想知道为什么它之前失败,因为order by默认情况下不区分大小写我想这里提到http://dev.mysql.com/doc/refman/5.7/en/sorting-rows.html

我在MySQL 5.7+上启用了所有默认的sql_modes

1 个答案:

答案 0 :(得分:1)

我认为错误信息非常清楚。出现错误是因为title可以引用表中的列或列别名。搜索首先查找列,因此查询被解释为:

SELECT DISTINCT UPPER(LEFT(t.title, 1)) as title
FROM <table_name> t
ORDER BY LEFT(t.title, 1);

我认为你可以通过使用不同的别名来解决这个问题:

SELECT DISTINCT UPPER(LEFT(t.title, 1)) as new_title
FROM <table_name> t
ORDER BY LEFT(new_title, 1);