Тот же запрос.Тот же набор данных.Два сервера MySQL.ДВА РАЗНЫХ РЕЗУЛЬТАТА.Зачем? - PullRequest
0 голосов
/ 16 мая 2018

Точно такой же запрос. Точно такой же набор данных. Два разных сервера 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.

Результаты

Сервер 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]

Сервер 2 mysql Ver 15.1 Distrib 5.5.56-MariaDB, for Linux (x86_64) using readline 5.1 возвращает те же 29 строк по SORTED ASC.

21
23
30
33
1013
1027
1042
2221
[etc]

Это часть запроса WordPress, где я пытаюсь получить список терминов таксономии, отсортированных по последним публикациям в каждом термине. Использование идентификатора объекта post_meta является достаточно близким приближением к дате последнего сообщения (я знаю, что на самом деле это порядок самого последнего добавления к этому термину, но это достаточно близко и позволяет избежать объединения с таблицей 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
  ) );
?>

1 Ответ

0 голосов
/ 16 мая 2018

Я ожидаю, что если таблица series_term_ids отсортирована, то SELECT DISTINCT будет захватывать первую строку для каждого term_taxonomy_id.

MySQL не гарантирует порядок в таких обстоятельствах.

Вам лучше быть немного более буквальным и делать что-то вроде:

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