gpt4 book ai didi

mysql select字段决定结果集的顺序

转载 作者:行者123 更新时间:2023-11-29 06:46:03 26 4
gpt4 key购买 nike

目前,我的 mysql 5.6 查询之一遇到了(对我来说)非常奇怪的行为。

我有一个正在尝试优化的给定系统。一个步骤是仅选择下一步操作所需的字段。

给定的查询如下所示:

SELECT oxv_oxcategories_6_fr.*
FROM oxv_oxobject2category_6 AS oxobject2category
LEFT JOIN oxv_oxcategories_6_fr ON oxv_oxcategories_6_fr.oxid =
oxobject2category.oxcatnid
WHERE oxobject2category.oxobjectid = '<hashed id>'
AND oxv_oxcategories_6_fr.oxid IS NOT NULL
AND (oxv_oxcategories_6_fr.oxactive = 1
AND oxv_oxcategories_6_fr.oxhidden = '0')
ORDER BY oxobject2category.oxtime

我在自己的查询中随意使用了更合理的命名:

SELECT
category_view.*
FROM oxv_oxobject2category_6 category_mapping_view
LEFT JOIN oxv_oxcategories_6_fr category_view ON category_view.OXID =
category_mapping_view.OXCATNID
WHERE category_mapping_view.OXOBJECTID = '<hashed id>'
AND category_view.OXID IS NOT NULL
AND (category_view.OXACTIVE = 1
AND category_view.OXHIDDEN = '0')
ORDER BY category_mapping_view.OXTIME

如您所见,没有太大区别,只是命名不同。到目前为止,一切都按预期进行。现在我试图只选择我需要的值。所以查询看起来像这样:

SELECT
category_view.OXID,
category_view.OXTITLE
FROM oxv_oxobject2category_6 category_mapping_view
LEFT JOIN oxv_oxcategories_6_fr category_view ON category_view.OXID =
category_mapping_view.OXCATNID
WHERE category_mapping_view.OXOBJECTID = '<hashed id>'
AND category_view.OXID IS NOT NULL
AND (category_view.OXACTIVE = 1
AND category_view.OXHIDDEN = '0')
ORDER BY category_mapping_view.OXTIME;

这也按预期工作。但是,我还需要字段 OXPARENTID,因此我将 SELECT 语句更改为

category_view.OXID,
category_view.OXTITLE,
category_view.OXPARENTID

现在项目的顺序不同了,我似乎无法找出原因。新查询和原始查询均按 OXTIME 排序,但最终结果集中不存在该字段。大约有 10 个 OXTIME 为 0 的条目,一旦我查询 OXPARENTID,这些条目就会被翻转(按顺序排列)。

在原始查询中,OXPARENTID 也存在,那么为什么现在会有所不同呢?我猜测存在某种我还不知道的排序逻辑。

请注意,两个连接表实际上都是 View ,也许这与它有关。此外,OXIDOXPARENTID 都是 md5 哈希值。

任何帮助将不胜感激。

编辑

为了澄清,我知道多个条目的 OXTIME 等于 0 的事实使得无法预先预测哪个条目将是最上面的条目。但是,我仍然希望每次调用查询时条目的顺序都是相同的(无论我选择什么)。

一个答案(@GordonLinoff)解释说,

[...] the same query can return the results in different order on different runs

这种“随机性”从何而来?

最佳答案

您的订单是:

ORDER BY category_mapping_view.OXTIME;

然后你说:

There are about 10 entries where OXTIME is 0, and it is those items that get turned around (ordering-wise) as soon as I query for OXPARENTID.

你所拥有的是 key 上的纽带。结果可以按任何顺序排列——并且相同的查询可以在不同的运行中以不同的顺序返回结果。从技术上讲,SQL 中的排序不稳定

您可以通过在 ORDER BY 中包含另一列来解决此问题,这样每一行都由 ORDER BY 键唯一定义。也许这就是OXID:

ORDER BY category_mapping_view.OXTIME, category_view.OXID;

顺便说一句,“很明显”SQL 中的排序是不稳定的。为什么? SQL 表表示无序集。当键相同时,没有可依赖的顺序。

关于mysql select字段决定结果集的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49382941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com