MySQL после групповой сортировки → Как получить первые N или последние N элементов
MySQL после групповой сортировки → Как получить первые N или последние N элементов

счастливый момент

Вечером моя жена помогает моей дочери с домашним заданием по китайскому языку.

Заполните пропуск: Весна пришла, __ зеленый.

Дочка: Весна пришла, папа зеленый.

Жена с недовольным видом спросила: Повтори, весна пришла, что такое зеленое?

Дочка: Весна пришла, папа зеленый.ах

Жена очень разозлилась, но все равно нежно спросила: Скоро весна, почему папа зеленый?

Дочь сказала с легким плачем: А как насчет зимы?

Жена тревожно почесала затылок: Зима, зима, зима... При чем здесь погода? Тогда разве трава не должна быть зеленой, когда приходит весна?

Дочь в растерянности посмотрела по сторонам и спросила: Когда же папа позеленеет?

Жена сердито щелкнула ручкой: Я не знаю, когда твой папа станет проституткой, ты спроси у папы

Дочка повернулась ко мне и спросила: Папа, когда ты позеленеешь?

Сердце у меня екнуло, эта ватная курточка пропускала воздух. Я осторожно посмотрел на жену и твердо сказал: Папа не будет зеленым!

Обзор

Когда я просматривал свой блог два дня назад,,Перевернутый:Вспомни интересное время SQL выполнить → После группировки получите первую запись каждой группы.

Я вдруг понял, что вроде бы есть продолжение, которое я еще не написал.

Подойдя к концу, действительно есть сомнение

Но я хочу подчеркнуть один момент: это вопрос, который я вам оставляю, а не обещание, которое я вам даю!

Продолжение я не писал, так что можно не злиться. Если ты действительно злишься, то бей меня!

Получить первую запись после группировки

Давайте сначала кратко рассмотрим метод калибровки.

1. Пройтись по базе данных

Логика очень ясна,сделать зарядку тоже очень просто,но будет проходить через библиотеку данных,Спецификации разработки обычно явно запрещают этот тип написания.

2. GROUP BY в сочетании с функцией MySQL.

После GROUP BY используйте GROUP_CONCAT(log_id ORDER BY data_date DESC,modify_time DESC) для объединения log_id

Затем используйте функцию SUBSTRING_INDEX, чтобы перехватить первый log_id.

  Наконец, INNER JOIN

    но, GROUP_CONCAT Существует проблема с ограничением длины, по умолчанию 1024 байты ( show variables like 'group_concat_max_len'; )

3. Добавьте последнюю таблицу рекордов.

Таблица специально используется для записи последней записи об успешном выполнении задачи.

Логика ведения данных таблицы: вставить, если их нет,Обновить, если оно существует(Если запись не существует, вставьте ее и обновите, если она существует. → MySQL извыполнить Какие способы?

Возьмите первые N предметов или последние N предметов.

Вернемся к заголовку: как после группировки и сортировки получить первые N записей или последние N записей?

Цикл по базе данных

1. Первый запрос Task_id в пакетном режиме.

2. Затем проверьте t_task_exec_log одну за другой в соответствии с идентификатором задачи и отсортируйте ее, чтобы получить первые N записей.

3. Наконец, выполните конвергенцию данных и инкапсулируйте ее в формат данных, требуемый страницей.

Однако этот метод будет проходить через базу данных и обычно запрещен.

GROUP BY в сочетании с функциями MySQL

1. Первый запрос Task_id в пакетном режиме.

2. На основе этих идентификаторов задач выполните пакетный запрос строки набора log_id первых N записей каждой задачи из t_task_exec_log.

Язык кода:javascript
копировать
SELECT task_id, SUBSTRING_INDEX(GROUP_CONCAT(log_id ORDER BY data_date DESC, modify_time DESC),',', 5) log_ids
FROM t_task_exec_log 
WHERE exec_status='success' AND task_id IN (124,156,158,200,300,358,500,800,1000,1001)
GROUP BY task_id;

SUBSTRING_INDEX(str, delim, count) Дальнейшего описания не требуется.,Пожалуйста, прочитайте подробности:SUBSTRING_INDEX

count Параметры можно использовать перед калибровкой Nполоски или взаимной Nполоски.

  Как и раньше 5 полоска: SUBSTRING_INDEX(GROUP_CONCAT(log_id ORDER BY data_date DESC, modify_time DESC),',', 5)

  взаимный 5 полоска: SUBSTRING_INDEX(GROUP_CONCAT(log_id ORDER BY data_date DESC, modify_time DESC),',', -5)

3. Разделите log_ids запятой (,), чтобы получить список log_id, а затем выполните пакетный запрос из t_task_exec_log на основе списка log_id.

4. Наконец, данные агрегируются и инкапсулируются в формат данных, требуемый страницей.

Но следует учитывать ограничение длины GROUP_CONCAT.

Добавить последнюю таблицу рекордов

Этот метод больше подходит для случая, когда берется только первый элемент, но не подходит для случая N элементов.

Если N не фиксировано, трудно определить диапазон хранения данных этой таблицы.

Если для полной совместимости, то эта таблица становится t_task_exec_log, что бессмысленно.

Функция окна

Новые возможности MySQL8

  Об окнахфункция Доступна официальная документация:Window Functions,Без дальнейшего введения

  Мы используем ROW_NUMBER Приходитьвыполнить Возьмите первые N предметов или последние N предметов.

1. Пакетный запрос Task_id

  2. Используйте ROW_NUMBER ,Возьмите первые N предметов или последние N предметов.

Возьми первый

Результаты следующие:

Возьмите первые 5 предметов

Язык кода:javascript
копировать
SELECT * from (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY task_id ORDER BY data_date DESC, modify_time DESC) AS rn
    FROM t_task_exec_log 
    WHERE exec_status='success' 
    AND task_id IN (124,156,158,200,300,358,500,800,1000,1001)
) t WHERE rn <= 5;

Результаты следующие:

  Выбиратьвзаимный 5 полоска

Язык кода:javascript
копировать
SELECT * from (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY task_id ORDER BY data_date ASC, modify_time ASC) AS rn
    FROM t_task_exec_log 
    WHERE exec_status='success' 
    AND task_id IN (124,156,158,200,300,358,500,800,1000,1001)
) t WHERE rn <= 5;

Результаты следующие:

Оставьте вопрос, как получить первую полоску с помощью функции окна? Что? Не можешь написать?

Давайте посмотрим на GROUP BY в сочетании с функциями MySQL.

  Давайте посмотрим поближе GROUP BY объединить MySQL функция Выбиратьвзаимный 5 Результаты по полоска

  Мы нашли и функцию окна возьмем взаимную 5 Результаты по полосканепоследовательный

Какой метод неправильный или оба метода неверны?

  Давайте отрегулируем GROUP BY объединить MySQL функция Выбиратьвзаимный 5 полоскаиз写法

Язык кода:javascript
копировать
SELECT task_id, SUBSTRING_INDEX(GROUP_CONCAT(log_id ORDER BY data_date ASC, modify_time ASC),',', 5) log_ids
FROM t_task_exec_log 
WHERE exec_status='success' AND task_id IN (124,156,158,200,300,358,500,800,1000,1001)
GROUP BY task_id;

Результаты следующие:

  и окнофункция Выбиратьвзаимный 5 Результаты по полоска Последовательный

Раньше так писал

Что пошло не так?

Давайте сначала посмотрим на следующий SQL

  Я верю, что каждый может это понять и получить общую картину. 374 полоска рекорд

Мы объединяем log_id запятыми, чтобы получить строку

Язык кода:javascript
копировать
2911732,2859745,2499159,685756,611426,1773618,631452,2641408,862146,1652523,2655517,2829017,1273848,2804800,1346153,936083,326032,864980,2015739,2648288,1839113,1921285,1953625,453123,50498,2743528,2721333,2919955,372642,98491,1424351,411001,1482212,230620,1994696,2918589,729845,2694142,500264,1012517,2713357,2200896,974654,2717787,2457056,172360,2832664,2846066,1848934,1919788,732675,1950937,199880,452272,273194,1616674,1194494,574206,1765082,1689794,631552,2758932,2485780,1715193,459323,1455116,2115301,1233012,320608,2004650,291114,1244414,2924159,254791,1271023,2163511,1565143,2981613,1299572,320289,1732975,210406,1507432,638443,808796,1557188,181660,167930,2272885,1944188,262812,2023062,2462778,2123029,594954,190347,388515,2178560,1598418,2564269,1934342,2925082,1502641,1900920,684906,2154470,2046731,1703184,1291369,1176799,897154,1286441,2138541,358779,943677,2415429,785261,2051755,2038868,1217252,473186,2552463,928982,1151401,1925499,2808729,1921939,2119578,406768,1866953,180496,13656,2333480,2974079,510052,2605676,653081,1659249,1160006,445779,891431,1943934,2489901,2942196,1654209,2486759,2514795,2849804,2258416,1488416,1929865,1183551,2509115,2732442,2085668,155167,1404105,578027,647799,559332,242226,959127,1717819,1457281,2777656,61863,1558242,979673,1622502,2501716,1665362,532434,2753181,2234018,2707034,408087,1611263,534460,1894189,159376,60130,1191876,282199,517385,2858577,1784531,2030854,2314894,679800,809800,2875291,966557,1621580,1992525,2025266,831289,1817299,1927920,891559,2725289,1194667,1550104,332614,2806388,157145,1220399,240821,2063037,154538,359355,2278415,2630602,2902571,1777692,2196687,1350564,1148733,469669,2563548,1936924,2563736,2003906,877726,2292538,2859208,1204177,475146,489706,2378830,2648739,915623,1695372,924324,1256107,540292,1125327,2865163,2533333,2619710,286934,20214,709854,320888,2319692,707114,1191938,2072463,55703,1830338,500835,1807704,1072891,1667013,1112386,110901,1876567,1636858,112749,1492761,1658767,2801747,2958924,48303,1994737,2194535,2393165,671013,2033922,2885396,463995,2241443,990863,2002460,814506,2536522,2885553,2431339,2961562,1542264,243844,657825,1594584,1921044,1138212,2680904,160115,2792129,538559,1267940,2560155,736726,2703598,632802,789810,438915,1370898,1432282,2713566,365961,2606280,2212229,2657542,2937595,2627981,520690,1865823,429311,874447,920179,2931749,2747839,50134,2517467,2222347,2748625,1056689,1868505,487388,1879593,1607657,1160123,2125711,1755572,2387420,1414325,823557,1551361,820297,1127153,1637903,2917492,1120815,1431846,552906,309803,1077061,674581,2414226,1392681,249656,1669143,1981249,2662300,711478,1172051,2332973,714265,471843,2261154,584537,1758386,2711638,502326,714922,1135634,124863,1890229,2653580,1404021,2711808,1146362,1917812,264393,1666930,1442219,2010387,2193352,722880,1982728,475910,1372761,433962,2563593,1637767

  Мы используем LENGTH Длина нити по статистике функции

  общий 2853 байты и GROUP_CONCAT Ограничение длины по умолчанию составляет 1024 байт

  Мы используем SUBSTRING функциявернонитьрезать Прежде чем забрать 1024 индивидуальный байт

Получить строку

Язык кода:javascript
копировать
2911732,2859745,2499159,685756,611426,1773618,631452,2641408,862146,1652523,2655517,2829017,1273848,2804800,1346153,936083,326032,864980,2015739,2648288,1839113,1921285,1953625,453123,50498,2743528,2721333,2919955,372642,98491,1424351,411001,1482212,230620,1994696,2918589,729845,2694142,500264,1012517,2713357,2200896,974654,2717787,2457056,172360,2832664,2846066,1848934,1919788,732675,1950937,199880,452272,273194,1616674,1194494,574206,1765082,1689794,631552,2758932,2485780,1715193,459323,1455116,2115301,1233012,320608,2004650,291114,1244414,2924159,254791,1271023,2163511,1565143,2981613,1299572,320289,1732975,210406,1507432,638443,808796,1557188,181660,167930,2272885,1944188,262812,2023062,2462778,2123029,594954,190347,388515,2178560,1598418,2564269,1934342,2925082,1502641,1900920,684906,2154470,2046731,1703184,1291369,1176799,897154,1286441,2138541,358779,943677,2415429,785261,2051755,2038868,1217252,473186,2552463,928982,1151401,1925499,2808729,1921939,2119578,406768,1866953,180496,13656,2333480,2974079,51

Затем мы используем SUBSTRING_INDEX для работы с указанной выше строкой.

Вы нашли причину?

  Такой способ письма, GROUP_CONCAT будет сделано в первую очередь 1024 Отрежьте длину, чтобы получить веревку

Затем над строкой работает SUBSTRING_INDEX, что приводит к ошибке конечного результата!

Подвести итог

  1、MySQL Он предоставляет множество функций и обеспечивает удобство для пользователей. Следует обратить внимание на его ограничения.

GROUP_CONCAT Длина по умолчанию 1024

  2、окнофункция

Это ключевой момент, который хочет подчеркнуть эта статья: новая функция MySQL8.

  Функция Особенностью окна является то, что оно обрабатывает каждую строку в наборе результатов как отдельный вычисляемый объект, а не разделяет набор результатов на группы и вычисляет совокупное значение для каждой группы.

MySQL8 Раньше после группировки можно было выполнять только операции агрегирования, а отдельные операции нельзя было выполнять над каждой записью в группе.

MySQL8 И после этого снимается ограничение, что после группировки можно выполнять только операции агрегации, что значительно облегчает нам некоторые специальные сценарии.

ROW_NUMBER Только одна из функций окон, MySQL Есть и другие функции Windows, всем рекомендую их проверить.

    Определенные агрегатыфункция плюс OVER 子句后就变成окнофункция Понятно,Эффект восстановления очень интересный,Рекомендуется всем внимательно прочитать официальную документацию.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose