【问题标题】:Same query. Same dataset. Two MySQL servers. TWO DIFFERENT RESULTS. Why?相同的查询。相同的数据集。两台 MySQL 服务器。两种不同的结果。为什么?
【发布时间】:2018-05-16 19:27:05
【问题描述】:

完全相同的查询。完全相同的数据集。两个不同的 MySQL 服务器。两种不同的结果。为什么?

查询:

SELECT DISTINCT term_taxonomy_id FROM (
  SELECT * FROM azEw_term_relationships 
  WHERE `term_taxonomy_id` IN 
   (SELECT term_taxonomy_id FROM azEw_term_taxonomy WHERE taxonomy = 'series')
ORDER BY object_id DESC) `series_term_ids`;

我的期望是,如果对 series_term_ids 表进行了排序,那么 SELECT DISTINCT 将获取每个 term_taxonomy_id 的第一行。

结果

Server 1 mysql Ver 14.14 Distrib 5.6.35, for osx10.9 (x86_64) using EditLine wrapper 按所需顺序返回 29 行:

61424
2221
3529
10404
21993
33
[etc]

Server 2 mysql Ver 15.1 Distrib 5.5.56-MariaDB, for Linux (x86_64) using readline 5.1 按 SORTED ASC 返回相同的 29 行。

21
23
30
33
1013
1027
1042
2221
[etc]

这是 WordPress 查询的一部分,我试图在其中获取按每个术语中的最新帖子排序的分类术语列表。使用 post_meta 对象 ID 是最新帖子日期的足够近似值(我知道它实际上是该术语的最新添加的顺序,但这足够接近并且避免连接到 wp_posts 表)。 WordPress 查询在这里(完全可以修改):

WordPress 模板

<?php
  global $wpdb;
  $query = "
    SELECT DISTINCT term_taxonomy_id
    FROM ( SELECT *
    FROM $wpdb->term_relationships
    WHERE `term_taxonomy_id` IN
    ( SELECT term_taxonomy_id
    FROM $wpdb->term_taxonomy
    WHERE taxonomy = 'series' )
    ORDER BY object_id DESC ) `series_term_ids`";
  $output = 'ARRAY_A';
  $series_array = $wpdb->get_results( $query, $output );


  $s_terms = get_terms( array(
   'taxonomy' => 'series',
   'orderby' => 'include',
   'include' => array_column( $series_array, 'term_taxonomy_id' ),
   'hide_empty' => 1
  ) );
?>

【问题讨论】:

  • 我认为你已经回答了关于你的期望的问题
  • 并不是说 MySQL 保证将子查询的 ORDER 保留在它之外(如果 iirc 觉得它不相关,有时甚至会忽略它),但是... object_id 在azEw_term_relationships 中是唯一的吗?
  • 表名的变量通常表明数据库设计不佳。
  • Object_id 是唯一的。表名的变量是什么意思?在这段代码中,我试图将表数据提取到一个变量中,但表名是固定的。
  • 我的 php 无疑是初级的,但在我看来,$wpdb-&gt;term_relationships$wpdb-&gt;term_taxonomy 的使用看起来很像变量而不是表名。

标签: mysql wordpress taxonomy post-meta


【解决方案1】:

我的期望是如果 series_term_ids 表是排序的,那么 SELECT DISTINCT 将抓取每个 term_taxonomy_id 的第一行。

MySQL 不保证这种情况下的顺序。

你最好是更直接一点,做一些类似的事情:

SELECT A
FROM (...) AS theSubQ
GROUP BY A
ORDER BY MAX(B) DESC
;

【讨论】:

  • 这正是我的研究引导我的方向。但我发现在三个不同的服务器中我没有得到三个不同的结果很有趣。显然不能信任 DISTINCT 来维持秩序。
  • 这是正确答案。 MySQL 和 MariaDB 的排序顺序不同。
猜你喜欢
  • 1970-01-01
  • 2019-05-18
  • 2012-06-22
  • 2010-10-10
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多