通过显示错误 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服务器

如何修复“错误 130 (HY000):文件格式不正确”

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)