Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
Задача: Выборка первой/последней записи в группах. Примеры задач: -- выбрать самый последний пост каждого юзера -- выбрать самый крупный заказ по каждому товару -- выбрать для каждого отдела работника с самой крупной зарплатой, и так далее Предварительный анализ. Задача требует уточнения: возможны 4 варианта логики (назовем их Т1, Т2, Т3 и Т4): Т1: Для ВСЕХ отделов вывести ОДНОГО работника. Если в отделе нет работников, вывести NULL, если двое и больше работников имеют одинаковые максимальные зарплаты то вывести первого по ИД. Т2: Для ВСЕХ отделов вывести ОДНОГО ИЛИ БОЛЕЕ работников с максимальной зарплатой. Если в отделе нет работников, вывести NULL Т3: Для НЕПУСТЫХ отделов вывести ОДНОГО работника. Если двое и больше работников имеют одинаковые максимальные зарплаты то вывести первого по ИД. Т4: Для НЕПУСТЫХ отделов вывести ОДНОГО ИЛИ БОЛЕЕ работников с максимальной зарплатой. Постановка тестовой задачи и структура таблиц: Код: sql Примерный бизнес смысл: юзеры создают сообщения, которые имеют некую оценку (например другие юзеры оценивают *интересность* сообщения). Надо выбрать для каждого юзера самый интересный (по оценкам) пост. Варинаты запросов. Все задачи (Т1..Т4) можно решить несколькими способами. Рассмотрим варинаты с указанием подходяшей задачи Для удобства назовем СКЛ-ы С1..С5 С1: Агрегатный подселект в FROM блоке -- задача Т4 Код: sql С2: MAX(salary) подселект в WHERE блоке -- решение для Т3 Код: sql C3: (ORDER BY salary LIMIT 1) подселект в WHERE блоке -- задача Т3 Код: sql C4: Двойной левый джоинт с неравенством и проверкой на NULL -- задача Т2 Код: sql С5: Использование переменных -- относительно сложный метод -- смотрите по ссылкам ниже. Рекомендации: Разные меторы решения могут быть быстрее или медленнее в зависимости от задачи и размера таблиц. Т1 -- С2, C3, С5, С4 Т2 -- С4, С2, Т3 -- С2, С4 Т4 -- С1, С5 Референсы: ///topic/613714 ///topic/611929&pg=3 P.S. Собрать коллекцию СКЛ-ов помогла дискуссия с Lonely.K и Alex_Ustinov ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2009, 08:45 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
Вах, спасибо большое! Видно тебя в последнее время утомили вопросы на эту тему по 5 штук за день! :) Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2009, 15:42 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
mahoune, Задача вполне интересная и реально часто встречается. На самом деле вопросы не утомили, но почти всегда нужно дополнительно тратить время на уточнение точной логики. При наличии 4 подзадач и по 3-5 решений для каждого случая матрица рекомендованых решений будет полезна. П.С. а можно добавить в основной пост: Собрать коллекцию СКЛ-ов помогла дискуссия с Lonely.K и Alex_Ustinov. П.П.С В моем броузере (FF-352) ссылки получаются направлены на какую-то фигню, типа "http://xn---1-mlc7bv/". Ето можно подправить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2009, 07:11 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2009, 12:36 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
mahoune, Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2009, 17:05 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
Тебе спасибо! У меня мозг сломался на втором посте, когда я стал разбираться что к чему! :) Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2009, 18:02 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
javajdbc Задача: Выборка первой/последней записи в группах. Примеры задач: -- выбрать самый последний пост каждого юзера Вариант решения с одним обращением к таблице. Пример. Имеется табличка posts Код: plaintext 1. А вот сабжевый запрос: Код: plaintext 1. 2. 3. post "паровозиком" цепляется к датевремени и попадает в максимум, потом оттуда извлекается. Насчет универсальности метода не знаю, но во многих случаях прокатит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2009, 18:31 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
Яростный Меч, -- зачет! вертелась у меня похожая мысль, вот здесь используется сложение ИД и цислового значения для нахождения махимума по обоим параметрам /topic/613714#6445977 Похоже, что метод будет вполне универсальным для задачь типа Т3 (да и Т1). Можно добавить в конкат ИД или любой другой параметер -- главное что бы он был фиксированой или (подзаполненой до фиксированой) длины. .mahoune. а можно поставить предыдуший пост сразу после основного, а обсуждения может даже убрать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2009, 19:46 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
Да, обсуждения порежу, а пост поставить вверх не выйдет. А что касательно метода, у меня давно руки чесались, я так в экселе обычно его юзаю, и все думал, как его можно к БД прикрутить Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2009, 19:47 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
javajdbcМожно добавить в конкат ИД или любой другой параметер -- главное что бы он был фиксированой или (подзаполненой до фиксированой) длины.Не только. Еще нужно чтобы строковое (или то, к которому приводится) представление сортировалось так же, как исходное. Иначе MAX может сработать неправильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2009, 19:48 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
miksoft, НУ для повседневных типов перевод в строчку -- сортировку не изменит (варчар добить пробелами справа, а номер добить нулями слева). МОжет для каких-то екзоотических типов (нех? юникоде?) ето и проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2009, 03:51 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
А как модифицировать С2, стобы сразу получать имя сотрудника с мин. и макс. зарплатой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2009, 12:52 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
qwerty90210, поясните, что Вы имеете ввиду? для каждого отдела вывести двух сотрудников (мин и макс)? с какой логикой (Т1, Т2, Т3 и Т4)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2009, 16:30 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
А разве запрос С1 верный? Почему там join по max(score) = id ? Зарплата приравнивается к ID ? Да и user_id не учитывается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2010, 12:57 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
не понятно, >> А разве запрос С1 верный? Почему там join по max(score) = id ? >> Зарплата приравнивается к ID ? Угу , есть такое дело..... типография приносит извинения. Должно быть: Код: plaintext 1. 2. 3. 4. 5. >> Да и user_id не учитывается Юзер подвязывается в последней строчке. Тут вроде все правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2010, 16:40 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
javajdbcДолжно быть:Поправил в исходном посте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2010, 16:44 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
Вариант, когда нужно вывести по N постов каждого юзера (в примере 3): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Функция зависима от СУБД, но в нормальных СУБД давно есть rank over. Данный пример что-то вроде эмуляции этой функции. Также не стоит забывать про ограничение group_concat, но по дефолту там около 1024 символов, для выборки небольшого кол-ва N с числовым id хватит за глаза. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2012, 17:48 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
замечание:javajdbc C3: (ORDER BY salary LIMIT 1) подселект в WHERE блоке -- задача Т3 javajdbc Рекомендации: Разные методы решения могут быть быстрее или медленнее в зависимости от задачи и размера таблиц. Т1 -- С2, C3, С5, С4 Т2 -- С4, С2, Т3 -- С2, С4 --где С3? Т4 -- С1, С5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2012, 08:03 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
Шогал, да, интересное добавление. В другом FAQ есть описание "ранк" и "денсе ранк" имплементация для таких запросов MYSQL. (a.k.a. Top-N query) FAQ: Нумерация строк и другие вопросы про использование переменных Я подозреваю что на переменный будет быстрее, хотя интересно будет проверить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2012, 23:22 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
tanglirТ1 -- С2, C3, С5, С4 Т2 -- С4, С2, Т3 -- С2, С4 --где С3? Т4 -- С1, С5[/quot] Да, конечно...Вы правы. Наверно каждую задачу можно решить каждым методом. например Т4 можно сделать методом С4 если убрать ЛЕФТ в третьей строчке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2012, 23:30 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
javajdbc, наверное, можно, но показаны, как я понимаю, наиболее подходящие. А тут я просто заметил явное несоответствие матрицы решений с описанием решения C3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2012, 04:17 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
С1 должно наверное быть Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 11:14 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
javajdbcmiksoft, НУ для повседневных типов перевод в строчку -- сортировку не изменит (варчар добить пробелами справа, а номер добить нулями слева). МОжет для каких-то екзоотических типов (нех? юникоде?) ето и проблема. Это вы ребята глубоко заблуждаетесь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 11:28 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
MasterZivjavajdbcmiksoft, НУ для повседневных типов перевод в строчку -- сортировку не изменит (варчар добить пробелами справа, а номер добить нулями слева). МОжет для каких-то екзоотических типов (нех? юникоде?) ето и проблема. Это вы ребята глубоко заблуждаетесь...Контрпример будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 12:33 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
miksoft, Перевод даты в формат не YYYYMMDD, или в любой формат с месяцем в виде названия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2014, 10:20 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
MasterZivmiksoft, Перевод даты в формат не YYYYMMDD, или в любой формат с месяцем в виде названия.Ну так подразумевалось использование правильного формата, а не абы какого. Тем более, что в MySQL формат по умолчанию для даты как раз является правильным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2014, 10:31 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
miksoft, Просто вот это самое, что вы тут предлагаете, называется "нарушение доменной целостности данных". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2014, 10:53 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
MasterZivС1 должно наверное быть Код: sql 1. 2. 3. 4. 5. 6. Да, похоже, что мы прошляпили... Правлю в исходном посте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2014, 21:14 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
MasterZivС1 должно наверное быть Код: sql 1. 2. 3. 4. 5. 6. ??? ваш запрос -- копия оригинала в первом сообшении. Что не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2014, 23:58 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
javajdbc, miksoftПравлю в исходном посте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2014, 00:05 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
javajdbcMasterZivС1 должно наверное быть Код: sql 1. 2. 3. 4. 5. 6. ??? ваш запрос -- копия оригинала в первом сообшении. Что не так? Ок, я понял что запрос был модифицирован в оригинальном сообшении. Если не секрет, что имено было заменено? Сейчас выглядит логически верным, хотя я бы еше поставил STRAIGHT_JOIN оба раза и в последней строчке заджоинил бы на zz.user_id Код: sql 1. 2. 3. 4. 5. 6. логика -- 1. недопустить попыток оптимизатора начать НЕ с агрегата, и таким образом НЕ использовать индексы. 2. точный способ жоинта я не знаю, но p.user_id нужен только на связку и не нужен в конечном результате. в варинате join user u on u.id=p.user_id мускл обязан выбрать и сохранить это значение. в варинате [STRAIGHT_] JOIN user u on u.id=zz.user_id p.user_id хранить не надо. Или это без разницы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2014, 00:17 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
MasterZivmiksoft, Просто вот это самое, что вы тут предлагаете, называется "нарушение доменной целостности данных". Предложеный метод -- довольно екзоотичный. Никто не предлагает его для повседневной работы. Если уж кто-то возмется -- так и проверку будет делать сам. Преобразование все равно надо делать в явном виде для многих видов (например, как было указано, числа надо добивать нулями слева). Вы правильно добавили время/даты в этот список. "нарушение доменной целостности данных" -- умные слова то какие. Никто ничего не нарушает и исходные данные не изменяются в базе. Времено, на лету, данные преобразуются в стринги и обратно. (пакуются и распоковываются). При этом специально указывается что надо найти способ сохранения порядка сортировки исходных данных. И а если кто этого не поймет и начнет сортировать названия месяцев, то, по русски говоря "сдуру и пенис сломать можно" а уж "целкостность домены" и подавно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2014, 01:34 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
javajdbc "нарушение доменной целостности данных" -- умные слова то какие. Слова не очень и умные, а смысл их простой — нельзя менять тип данных в процессе их обработки. Например, если ты преобразует float в varchar и потом обратно, ты потеряешь точность (будет погрешность), если ты склеишь два текстовых поля через разделитель, потом есть риск разделить их обратно неверно, разделитель может уже был в одном из полей. javajdbcНикто ничего не нарушает и исходные данные не изменяются в базе. Времено, на лету, данные преобразуются в стринги и обратно. (пакуются и распоковываются). При этом специально указывается что надо найти способ сохранения порядка сортировки исходных данных. Вот это оно самое и есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2014, 08:33 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
MasterZiv, ОК, поправка принимается -- этот метод можно использовать ЗА ИСКЛЮЧЕНИЕМ типов данных которые не гарантируют оригинальный порядок сортировки после преобразования (например в строковую переменную) и не гарантируют 100% возврат значения после преобразования обратно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2014, 18:52 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. Что за минусы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2017, 09:30 |
|
||
|
FAQ: Выборка первой/последней записи в группах
|
|||
|---|---|---|---|
|
#18+
Hett Код: sql 1. Что за минусы?Это измнение знака числа. По сути это DESC Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2017, 10:55 |
|
||
|
|

start [/forum/topic.php?all=1&fid=47&tid=1830925]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 378ms |

| 0 / 0 |
