Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么在运行group by和order by时结果不合适?_Mysql - Fatal编程技术网

Mysql 为什么在运行group by和order by时结果不合适?

Mysql 为什么在运行group by和order by时结果不合适?,mysql,Mysql,我的问题是这样的: SELECT * FROM products_categories WHERE product_id = 1 ORDER BY updated_at DESC 如果查询运行,结果如下所示: SELECT * FROM products_categories WHERE product_id = 1 ORDER BY updated_at DESC 我像这样添加group by: SELECT * FROM products_categories WHERE product

我的问题是这样的:

SELECT *
FROM products_categories
WHERE product_id = 1
ORDER BY updated_at DESC
如果查询运行,结果如下所示:

SELECT *
FROM products_categories
WHERE product_id = 1
ORDER BY updated_at DESC
我像这样添加group by:

SELECT *
FROM products_categories
WHERE product_id = 1
GROUP BY product_id
ORDER BY updated_at DESC
结果:显示1记录id=1

它不合适。显示的id是否为最新更新的id=3


我该如何解决它呢?

不幸的是,您被mysql的奇怪行为困住了,其他一些sql引擎(如sqlite)也会这样做。根据sql98,您的sql查询不正确,应该会产生错误。您不能选择未分组或未使用聚合函数max/min/avg的字段。不幸的是,mysql不会产生错误,但会为定义不正确的字段返回第一个值

group by将把具有相同产品id的所有行合并为一行。这就是你回错一行的原因。我想你认为点菜会先于点菜。事实并非如此。将按行对单个分组进行排序

如果要在获取最新更新的\u,应查询: 在product_id=1的products_categories中选择maxupdated_at,然后在另一个select中查询使用此值的行。从products_categories(products_id=1)选择*并从products_categories(products_id=1)选择maxupdated_at。当然,如果您的updated_at值不唯一,它可能无法按预期工作。然后您将得到多个结果

如果您需要严格的一排答案,您可以这样做 从产品类别中选择*
其中product_id=1,由描述限制1处更新的_订购

GROUPBY背后的思想是对GROUPBY子句中的每个值或多个值将多个记录分组在一个结果中。由于在其他字段(如sum、max、group_concat等)上没有任何聚合函数,因此它将显示组中某一行的值。order by在分组后应用,因此在您的情况下,您获得的值不是由order by确定的。使用group by order by时,它的工作方式与正常情况不同。