通过显示错误 3065(HY000) 具有不同和顺序的 MySQL 查询
Posted
技术标签:
【中文标题】通过显示错误 3065(HY000) 具有不同和顺序的 MySQL 查询【英文标题】:MySQL query with distinct and order by showing error 3065(HY000) 【发布时间】:2018-03-10 00:30:19 【问题描述】:我在我的机器上使用 linux mint 并尝试执行查询。执行后提示错误
ERROR 3065 (HY000): ORDER BY 子句的表达式 #1 不在 SELECT 列表中,引用列 'shelterl_local.animal.changed' 不在 SELECT 列表中;这与 DISTINCT 不兼容
我加了一行
[mysqld]
sql-mode=''
在/etc/mysql/my.cnf
文件中并重新启动mysql。但仍然得到同样的错误。我提到了许多解决方案,但对我没有任何帮助。我的查询是
SELECT DISTINCT fs.etid AS etid FROM og_membership fs
LEFT OUTER JOIN node animal ON animal.nid = fs.etid LEFT OUTER JOIN
field_data_field_for_animal dfa ON dfa.field_for_animal_value = fs.etid
LEFT OUTER JOIN node pastid ON pastid.nid = dfa.entity_id WHERE ( (fs.gid =
464) OR
(animal.nid IN
(1196113,1211208,1218831,1243640,1254254,
1253603,1249890,1261729,1261282,1258378,1273745,1270760,
1279219,1276040,1276031,1275684,1288727,1289306,1300545,
1313770,1313761,1313755,1313746,1313330,1312388,1310673,
1309431,1315024,1333640,1328041,1323565,1327216,1330104,
1327786,1326810,1335812,1333094,1341309,1340358,1348088,
1351077,1351071,318214,1342698,1472755,1491527,1351652,1353488,
1507763,1342713)) )AND (fs.entity_type = 'node')
AND (animal.type = 'animal') AND (animal.status = 1) AND (pastid.title LIKE
'%A%')
ORDER BY animal.changed DESC LIMIT 0,300;
是否可以永久删除此错误并执行查询?请帮忙
【问题讨论】:
MySQL 不知道在排序时使用field2
的哪个 值。您需要告诉我们您想如何排序。
@TimBiegeleisen,我添加了实际查询。请看一下
完整的查询实际上在很大程度上与您的问题无关。您可以在下面评论我的回答。
【参考方案1】:
您的初始查询相当于以下内容:
SELECT field1 AS f1
FROM table t
--Joins and conditions
GROUP BY field1
ORDER BY field2 DESC LIMIT 0,300
这不合逻辑,因为结果集中field1
的每个值都可能有多个 值field2
与之关联。您看到的错误是 MySQL 的说法,它无法弄清楚您想要做什么。一种解决方法是对field2
的聚合进行排序,例如尝试以下方法:
SELECT field1 AS f1
FROM table t
--Joins and conditions
GROUP BY field1
ORDER BY MAX(field2) DESC -- or AVG(field2), or MIN(field2), etc.
LIMIT 0,300
【讨论】:
案例一:Mysql会考虑先到的记录但不会产生错误。 @Jack 不,我不相信这种说法是完全准确的。如果 MySQL 在关闭严格模式的情况下运行,我认为你是正确的,否则我会期待来自 OP 的错误。实际上,如果您查看文档,您会发现SELECT DISTINCT
通常是在后台使用 GROUP BY
完成的。
是的,如果发生此类错误,则应关闭严格模式。 @Arun 这里按 animal.changed 排序在输出中没有多大意义。我可以根据您希望排序的内容知道吗?【参考方案2】:
你需要实际选择field2
SELECT DISTINCT field1 AS f1,
field2
FROM table t
--Joins and conditions
ORDER BY field2 DESC LIMIT 0,300
更新:
我知道在同一个查询中使用 DISTINCT 和 ORDER BY 时有时会出现错误。为了解决这个问题,我会给animal.changed部分一个别名,例如[animal.changed],然后如果你按[animal.changed]排序,这应该不会出错。至少我知道这肯定适用于 SQL 服务器
E.G
SELECT DISTINCT animal.changed AS [animal.changed]
FROM .....
ORDER BY [animal.changed]
这是非常基本的,但允许您在同一查询中使用 DISTINCT 和 ORDER BY,这是您当前遇到的错误。
【讨论】:
我需要在编辑后的问题中处理查询才能工作。请看一下 这将修复错误,但它是一个不同的查询。【参考方案3】:如果您选择一列,则只能对该列进行排序。如果您需要按另一列排序,则必须在选择中包含该列。
//错了.....
$sql="Select DISTINCT Rubrika from tmp3 order by View desc limit 3";
$res_r=mysqli_query($Link, $sql);
//对!!!
$sql="Select DISTINCT Rubrika, View from tmp3 order by View desc limit 3";
$res_r=mysqli_query($Link, $sql);
【讨论】:
以上是关于通过显示错误 3065(HY000) 具有不同和顺序的 MySQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
mysqli_connect(): (HY000/2002): 无法通过socket连接到本地MySQL服务器
debian, mysql 错误 2002 (HY000), phpmyadmin
错误 2002 (HY000): 无法通过套接字 '/tmp/mysql.sock' 连接到本地 MySQL 服务器
错误 2002 (HY000): 无法通过套接字 '/tmp/mysql.sock' 连接到本地 MySQL 服务器
错误 2002 (HY000): 无法通过 '/var/run/mysqld/mysqld.sock' 连接到本地 MySQL 服务器 (2)