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

时间:2018-03-20 11:22:58

标签: 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.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

我已经使用libery在我自己的查询中使用更合理的命名:

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也存在,那为什么它现在有所作为呢?我猜测有一些我还不知道的排序逻辑。

请注意,两个连接表实际上都是视图,可能与它有关。此外,OXIDOXPARENTID都是md5哈希值。

非常感谢任何帮助。

修改

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

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

  

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

这个&#34;随机性&#34;来自?

1 个答案:

答案 0 :(得分:2)

您的订购是:

ORDER BY category_mapping_view.OXTIME;

然后你说:

  

大约有10个条目,其中OXTIME为0,并且只要我查询OXPARENTID就会转向那些项目(按顺序排序)。

你所拥有的是钥匙的关系。结果可以是任何顺序 - 并且相同的查询可以在不同的运行中以不同的顺序返回结果。从技术上讲,SQL中的顺序是不稳定

您可以通过在ORDER BY中添加其他列来解决此问题,以便每一行都由ORDER BY键唯一定义。也许那是OXID

ORDER BY category_mapping_view.OXTIME, category_view.OXID;

顺便说一下,它显而易见&#34;在SQL中排序是不稳定的。为什么? SQL表表示无序集。当密钥相同时,没有任何顺序可以依赖。