mysql select 字段决定结果集的顺序
mysql select field determines order of result set
对于我的 mysql 5.6 查询之一,我目前遇到(对我而言)非常奇怪的行为。
我有一个正在尝试优化的给定系统。第一步是仅 select 下一个操作所需的字段。
给定的查询如下所示:
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 我需要的值。所以查询看起来像这样:
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
也存在,那么为什么现在有所不同?我猜有某种我还不知道的排序逻辑在进行。
请注意,两个连接表实际上都是视图,也许这与它有关。此外,OXID
和 OXPARENTID
都是 md5 哈希值。
如有任何帮助,我们将不胜感激。
编辑
为了澄清,我知道多个条目 OXTIME
等于 0 的事实使得无法事先预测哪个条目将是最前面的条目。但是,我仍然希望每次调用查询时条目的顺序都是相同的(不管我在 selecting 是什么)。
一个回答 (@GordonLinoff) 解释说,
[...] the same query can return the results in different order on different runs
这个"randomness"从哪里来的?
您的订单是:
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.
你所拥有的是钥匙上的纽带。结果可以按 任意 顺序排列——同一个查询可以 return 在不同的运行中以不同的顺序排列结果。从技术上讲,SQL 中的排序是 不稳定的 。
您可以通过在 ORDER BY
中包含另一列来解决此问题,这样每一行都由 ORDER BY
键唯一定义。也许那是 OXID
:
ORDER BY category_mapping_view.OXTIME, category_view.OXID;
对了,"obvious"排序在SQL不稳定。为什么? SQL 个表表示 无序 个集合。当密钥相同时,没有顺序可以回退。
对于我的 mysql 5.6 查询之一,我目前遇到(对我而言)非常奇怪的行为。
我有一个正在尝试优化的给定系统。第一步是仅 select 下一个操作所需的字段。
给定的查询如下所示:
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 我需要的值。所以查询看起来像这样:
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
也存在,那么为什么现在有所不同?我猜有某种我还不知道的排序逻辑在进行。
请注意,两个连接表实际上都是视图,也许这与它有关。此外,OXID
和 OXPARENTID
都是 md5 哈希值。
如有任何帮助,我们将不胜感激。
编辑
为了澄清,我知道多个条目 OXTIME
等于 0 的事实使得无法事先预测哪个条目将是最前面的条目。但是,我仍然希望每次调用查询时条目的顺序都是相同的(不管我在 selecting 是什么)。
一个回答 (@GordonLinoff) 解释说,
[...] the same query can return the results in different order on different runs
这个"randomness"从哪里来的?
您的订单是:
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.
你所拥有的是钥匙上的纽带。结果可以按 任意 顺序排列——同一个查询可以 return 在不同的运行中以不同的顺序排列结果。从技术上讲,SQL 中的排序是 不稳定的 。
您可以通过在 ORDER BY
中包含另一列来解决此问题,这样每一行都由 ORDER BY
键唯一定义。也许那是 OXID
:
ORDER BY category_mapping_view.OXTIME, category_view.OXID;
对了,"obvious"排序在SQL不稳定。为什么? SQL 个表表示 无序 个集合。当密钥相同时,没有顺序可以回退。