Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выборка с группой 
V
    Опции темы
bars80080
Дата 25.8.2014, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 1
Всего: 315



MySQL

что-то я туплю или давноэтим не занимался.

есть таблица `reester`, в которой есть записи с полями:
`order` int
`date` int

может быть несколько записей с одинаковым `order`
мне нужно получить 10 записей с максимальным `date`, но разным `order`

что-то вроде:

Код

SELECT * FROM `reester` GROUP BY `order` ORDER BY `date` LIMIT 10


но как это бывает при группировке, в date оказывается значение из случайной строчки при группировке.
как бы это дело отсортировать, а затем сгруппировать?
можно ли одним запросом?
PM MAIL WWW   Вверх
ТоляМБА
Дата 25.8.2014, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 4
Всего: 252



Код
SELECT DISTINCT `order`, `date`
FROM `reester` as `r`
INNER JOIN 
(SELECT Max(`date`) as `MaxDate`
FROM `reester`) as `A`
on `r`.`date`=`A`.`MaxDate`
LIMIT 10


Добавлено @ 16:49
Верхний вариант сработает на одну максимальную дату с 10-ю ордерами,
а вот это походу то что надо:
Код
SELECT DISTINCT `order`, `date`
FROM `reester`
ORDER by  `date` DESC
LIMIT 10


Это сообщение отредактировал(а) ТоляМБА - 25.8.2014, 16:54
PM   Вверх
ksnk
Дата 25.8.2014, 17:15 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: нет
Всего: 386



Код

SELECT `order`, max(`date`) as m FROM `reestr` group by `order` limit 10



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ТоляМБА
Дата 25.8.2014, 17:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 4
Всего: 252



ksnk, к твоему коду надо также добавить
Код
ORDER by 2 DESC


Это сообщение отредактировал(а) ТоляМБА - 25.8.2014, 17:37
PM   Вверх
bars80080
Дата 26.8.2014, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 1
Всего: 315



SELECT DISTINCT `order`, `date`
FROM `reester`
ORDER by  `date` DESC
LIMIT 10

в полной мере работает

а я уже и забыл это слово

спасибо большое
PM MAIL WWW   Вверх
Akina
Дата 26.8.2014, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(bars80080 @  26.8.2014,  11:00 Найти цитируемый пост)
в полной мере работает

Результат не соответствует исходной задаче.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ТоляМБА
Дата 26.8.2014, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 4
Всего: 252



Цитата(bars80080 @  25.8.2014,  18:32 Найти цитируемый пост)
10 записей с максимальным `date`, но разным `order`


Цитата(Akina @  26.8.2014,  21:49 Найти цитируемый пост)
Результат не соответствует исходной задаче. 

Обоснуй.
PM   Вверх
Akina
Дата 27.8.2014, 07:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



1) Записей с максимальной date может быть менее 10. Тогда в выборке будут записи с датой, отличной от максимальной, хотя по условию дата должна быть максимальной.
2) При этом в записях с разным date могут быть записи с одинаковым order, хотя по условию они обязаны быть разными.
3) Если date у 10 и 11 записей при сортировке по date совпадают, результат запроса недетерминирован.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ТоляМБА
Дата 27.8.2014, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 4
Всего: 252



Akina, хорошо. Твои предложения какие?
PM   Вверх
ksnk
Дата 27.8.2014, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: нет
Всего: 386



а такое, вроде работает.
Код

SELECT `order`, max(`date`) as m FROM `reester` group by `order` order by m DESC limit 10


в mysql что, DISTINT это DISTINCT ROWS? Блин, надо бы документацию почитать smile

P.S. добавил DESC в сортировку

Это сообщение отредактировал(а) ksnk - 27.8.2014, 09:38


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Akina
Дата 27.8.2014, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(ТоляМБА @  27.8.2014,  09:49 Найти цитируемый пост)
 Твои предложения какие? 

ОписАть задачу АБСОЛЮТНО ТОЧНО. Включая и то, что делать во всех указанных (и неуказанных тоже) "нестандартных" случаях.

Цитата(ksnk @  27.8.2014,  10:26 Найти цитируемый пост)
в mysql что, DISTINT это DISTINCT ROWS?

Смотря где применять. Если SELECT DISTINCT fields - то да.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bars80080
Дата 27.8.2014, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 1
Всего: 315



задача, конечно, не о 10 записях.

есть реестр, в который вносятся записи. поле order обозначает привязку к таблице заказов orderlist.id, а в поле date вносится текущее время timestamp. впоследствии поле date обновляется, если вносится ещё подобная запись на тот же order. при этом на один order может быть несколько записей (они отличаются друг от друга другими полями).

задача получить постраничный вывод свежеобновлённых заказов на основе реестра. то есть получить 10 заказов имеющих максимальный date в одной из относящейся к ним записи.

(чтоб не было лишней риторики, данную задачу нельзя выполнить простым добавлением поля date непосредственно в таблицу orderlist по ряду причин. реестр - суть вспомогательная табличка, хранящая короткий список актуальных заказов, в то время как самих заказов в orderlist дофигища, а по реестру проводится быстрый поиск по куче вычисленных параметров WHERE.)
PM MAIL WWW   Вверх
Akina
Дата 28.8.2014, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Ага, задача класса "выбрать последнюю запись для группы"... тогда в полный рост встаёт вопрос об используемой СУБД.
На "взрослых" (MS SQL, Oracle, etc.) задачу наиболее эффективно решать используя оконные функции. Если же они в используемой СУБД не реализованы, то используются различные обходные манёвры, причём выбор наиболее эффективного решения начинает зависеть от структуры хранения данных (в частности, наличие индексов) и вообще от особенностей конкретной СУБД.

Поскольку у тебя используется MySQL - предлагаю почитать FAQ: Выборка первой/последней записи в группах, где возможные пути решения неплохо разобраны.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.