MySQL-запрос, возвращающий меньше результатов при удалении GROUP BY - PullRequest
2 голосов
/ 26 августа 2011

У меня проблема с запросом, содержащим GROUP BY.В ходе диагностики я удалил оператор GROUP BY, чтобы увидеть необработанные данные - однако, когда я это делаю, я получаю FEWER строк, которые я делаю с GROUP BY.

Воспроизвести:

CREATE TABLE `test1` (
  `date` bigint(20) DEFAULT NULL,
  `quantity` int(11) DEFAULT NULL,
  `processed` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
INSERT INTO `test1` VALUES (1312483084,3,2),(1312483084,1,2),(1312483148,1,2),(1312483148,1,2),(1314038654,1,2),(1314301805,1,2);

Теперь запустите мой оригинальный SELECT (в комплекте с GROUP BY):

SELECT DATEDIFF(from_unixtime(test1.date), from_unixtime(1311801510)) DIV 28 AS date_idx,
min(DATEDIFF(from_unixtime(test1.date), from_unixtime(1311801510))) AS orig_date_idx,            SUM(test1.quantity) AS num_items,
IF(test1.processed in (2,3,4), 'Complete','Pending') as status
FROM test1
GROUP BY status, date_idx \G

Вы должны получить две строки:

*************************** 1. row ***************************
     date_idx: 0
orig_date_idx: 8
    num_items: 7
       status: Complete
*************************** 2. row ***************************
     date_idx: 1
orig_date_idx: 29
    num_items: 1
       status: Complete

Теперь удалите GROUP BY, то есть:

SELECT DATEDIFF(from_unixtime(test1.date), from_unixtime(1311801510)) DIV 28 AS date_idx,
min(DATEDIFF(from_unixtime(test1.date), from_unixtime(1311801510))) AS orig_date_idx,            SUM(test1.quantity) AS num_items,
IF(test1.processed in (2,3,4), 'Complete','Pending') as status
FROM test1

Внезапно вы получите только одну возвращенную строку - строка с date_idx == 1 в исходном результате была объединена сзапись для date_idx == 0

*************************** 1. row ***************************
     date_idx: 0
orig_date_idx: 8
    num_items: 8
       status: Complete

Все идеи с благодарностью приняты!

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Честно говоря, я удивлен тем, что он работает без единой ошибки при использовании агрегатных функций без группировки, возможно, имеет какое-то отношение к тому факту, что все ваши поля являются вычисляемыми значениями. В любом случае, избавьтесь от всех ваших агрегатных функций, чтобы получить доступ к базовым данным.

0 голосов
/ 26 августа 2011

Сумма является агрегацией, поэтому сворачивает строки для вас. Однако в случае использования также предложения group by, которое имеет приоритет, с последующим суммированием различных данных (из группировки). В этом случае группа генерирует две разные коллекции, которые затем суммируются. Другие данные могут возвращать другие результаты с группой.

0 голосов
/ 26 августа 2011

Тот факт, что вы удаляете директиву GROUP BY, делает ненужным для выполнения запроса подразделение ваших результатов на date_idx.Число равно равно от 1 и 7 в запросе GROUPED до 8 в запросе NON GROUPED.Без директивы GROUPBY у исполнителя запросов нет никаких причин выдавать вам более одной строки с агрегированной информацией, поскольку вы просто не запрашивали такое разделение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...