SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.02.2017 18:35:39

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Группировка с сортировкой - неожиданные результаты

Добрый вечер!

Есть такой запрос:


SELECT r.id, r.resource_id, GROUP_CONCAT(r.name), GROUP_CONCAT(r.id), GROUP_CONCAT(created_at)
FROM (
  SELECT lrr.id, lr.name, lrr.library_reader_id, lrr.resource_id, lrr.created_at
  FROM library_reader_resource lrr
  INNER JOIN library_reader lr ON (lr.id=lrr.library_reader_id)
  WHERE `status`='queue'
  ORDER BY lrr.created_at ASC
) r
GROUP BY r.resource_id
 



Возвращает такое (GROUP_CONCAT был добавлен для наглядного дебага, на самом деле нужен один ближайший reader):

# id, resource_id, GROUP_CONCAT(r.name), GROUP_CONCAT(r.id), GROUP_CONCAT(created_at)
'22', '11646', 'Иван Иванович,Иван Сергеевич Рухля,Елизавета Максимовна,Иван Сергеевич,Тесак Ньютон', '22,17,15,26,14', '2017-01-16 12:56:11,2017-01-25 16:00:30,2017-01-16 12:50:00,2017-01-16 13:01:13,2017-01-17 12:45:50'
'1', '21421', 'Олег Антонович,Антон Егорьевич,Иван Сергеевич', '1,35,36', '2017-01-11 16:52:07,2017-01-16 04:56:28,2017-01-16 20:56:11'

Небольшой дамп в файле прилагается.
Сервер MariaDB 10.1.21


Собственно вопрос, почему так? для теста писались и более простые запросы с сортировкой и последующей группировкой, которые являются "стандартным" решением задачи, но они тоже работают неверно, чем можно исправить ситуацию? Заранее благодарю!

Отредактированно Proger (20.02.2017 18:36:26)


Прикрепленные файлы:
Attachment Icon dump.sql, Размер: 8,785 байт, Скачано: 1,210

Неактивен

 

#2 20.02.2017 18:44:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Группировка с сортировкой - неожиданные результаты

сортировка в подзапросе не учитывается
см Группировка в MySQL

Неактивен

 

#3 20.02.2017 18:46:57

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Группировка с сортировкой - неожиданные результаты

То есть запрос надо перевернуть? Сначала группирую данные, а потом сортирую?

Неактивен

 

#4 20.02.2017 18:50:04

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Группировка с сортировкой - неожиданные результаты

да

Неактивен

 

#5 21.02.2017 11:32:15

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Группировка с сортировкой - неожиданные результаты

Что-то не так всё же...

Сделал такой запрос:


SELECT r.id, r.resource_id, r.name, r.id, library_reader_id, created_at
FROM (
  SELECT lrr.id, lr.name, lrr.library_reader_id, lrr.resource_id, lrr.created_at
  FROM library_reader_resource lrr
  INNER JOIN library_reader lr ON (lr.id=lrr.library_reader_id)
  WHERE `status`='queue'
  GROUP BY lrr.resource_id
) r
ORDER BY r.created_at ASC
 


Он возвращает это:

# id, resource_id, name, id, library_reader_id, created_at
'22', '11646', 'Иван Иванович', '22', '1', '2017-01-16 12:56:11'
'36', '21421', 'Иван Сергеевич', '36', '2', '2017-01-16 20:56:11'

Что-то всё равно неправильно, я что-то опять упускаю?
Если посмотреть в таблицу library_reader_resource то минимальное время 2017-01-11 и reader_id = 4, а его я так и не получаю...

Отредактированно Proger (21.02.2017 11:33:12)

Неактивен

 

#6 21.02.2017 12:27:33

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Группировка с сортировкой - неожиданные результаты

вы выбираете created_at без агрегатной функции, потому время выбирается случайным образом
см Группировка в MySQL

Неактивен

 

#7 21.02.2017 13:36:22

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Группировка с сортировкой - неожиданные результаты

Что-то я совсем запутался, избавился от ORDER и поступил по примеру из статьи.

Если кому-то будет полезно, вот такой запрос в итоге:


SELECT * FROM
(SELECT lrr.resource_id, MIN(lrr.created_at) as `created_at`
FROM library_reader_resource lrr
WHERE `status`='queue'
GROUP BY `resource_id`) r
INNER JOIN `library_reader_resource` lrr2 ON `lrr2`.`resource_id` = `r`.`resource_id` AND `lrr2`.`created_at` = `r`.`created_at`
 


Спасибо за помощь!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson