Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=37861842&tid=1830925]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
56ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 229ms |
| total: | 386ms |

| 0 / 0 |
