mysql选择字段决定结果集的顺序

mysql选择字段决定结果集的顺序,mysql,sql,oxid,Mysql,Sql,Oxid,对于我的一个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.ox

对于我的一个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
现在项目的顺序不同了,我似乎无法找到原因。新查询和原始查询都对OXTIME进行排序,而最终结果集中不存在该字段。OXTIME为0的条目大约有10个,在我查询OXPARENTID时,这些条目的顺序就会改变

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

请注意,两个连接的表实际上都是视图,这可能与此有关。此外,OXID和OXPARENTID都是md5散列值

任何帮助都将不胜感激

编辑

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

一个答案是@GordonLinoff解释说

[…]同一查询可以在不同的运行中以不同的顺序返回结果

这种随机性从何而来?

您的顺序是:

ORDER BY category_mapping_view.OXTIME;
然后你说:

OXTIME为0的条目大约有10个,在我查询OXPARENTID时,这些条目的顺序就会改变

你的钥匙里有领带。结果可以是任意顺序-同一查询可以在不同的运行中以不同的顺序返回结果。从技术上讲,SQL中的排序是不稳定的

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

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

您的顺序是:

ORDER BY category_mapping_view.OXTIME;
然后你说:

OXTIME为0的条目大约有10个,在我查询OXPARENTID时,这些条目的顺序就会改变

你的钥匙里有领带。结果可以是任意顺序-同一查询可以在不同的运行中以不同的顺序返回结果。从技术上讲,SQL中的排序是不稳定的

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


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

`和category\u view.OXACTIVE=1和category\u view.OXHIDDEN=0'`-这是一个内部连接,sql中没有隐式顺序。您只按oxtime排序,因此具有相同oxtime的其他字段将具有随机顺序。为什么不直接将其他字段添加到order by中?@AlexZen不幸的是,目前新旧系统都必须返回相同的结果。尽管我很想,但目前我无法改进该查询的顺序。`AND category_view.OXACTIVE=1,category_view.OXHIDDEN=0`-这是一个内部连接,sql中没有隐式顺序。您只按oxtime排序,因此具有相同oxtime的其他字段将具有随机顺序。为什么不直接将其他字段添加到order by中?@AlexZen不幸的是,目前新旧系统都必须返回相同的结果。尽管我很想,但目前我无法改进该查询的排序。谢谢您的回答。你能解释一下mysql是如何对结果进行排序的吗?我知道这个查询远非完美,但不幸的是,我无法更改顺序。但我仍然有这样的印象,如果我多次运行同一个查询,我会得到相同的结果,这实际上就是发生的情况。为什么mysql可能会改变一个查询到下一个查询的顺序,即使是同一个查询?@Micha。当键相同时,排序是不稳定的,因为SQL表表示无序集。你可以用很好的稳定排序来更好地理解这意味着什么。谢谢你的回答。你能解释一下mysql是如何对结果进行排序的吗?我知道这个查询远非完美,但不幸的是,我无法更改顺序。但我仍然有这样的印象,如果我多次运行同一个查询,我会得到相同的结果,这实际上就是发生的情况。为什么mysql可能会改变一个查询到下一个查询的顺序,即使是同一个查询?@Micha。当k EY是相同的,因为SQL表表示无序集。您可以使用良好的稳定排序来更好地理解这意味着什么。
category_view.OXID,
category_view.OXTITLE,
category_view.OXPARENTID
ORDER BY category_mapping_view.OXTIME;
ORDER BY category_mapping_view.OXTIME, category_view.OXID;