Вечером моя жена помогает моей дочери с домашним заданием по китайскому языку.
Заполните пропуск: Весна пришла, __ зеленый.
Дочка: Весна пришла, папа зеленый.
Жена с недовольным видом спросила: Повтори, весна пришла, что такое зеленое?
Дочка: Весна пришла, папа зеленый.ах
Жена очень разозлилась, но все равно нежно спросила: Скоро весна, почему папа зеленый?
Дочь сказала с легким плачем: А как насчет зимы?
Жена тревожно почесала затылок: Зима, зима, зима... При чем здесь погода? Тогда разве трава не должна быть зеленой, когда приходит весна?
Дочь в растерянности посмотрела по сторонам и спросила: Когда же папа позеленеет?
Жена сердито щелкнула ручкой: Я не знаю, когда твой папа станет проституткой, ты спроси у папы
Дочка повернулась ко мне и спросила: Папа, когда ты позеленеешь?
Сердце у меня екнуло, эта ватная курточка пропускала воздух. Я осторожно посмотрел на жену и твердо сказал: Папа не будет зеленым!
Когда я просматривал свой блог два дня назад,,Перевернутый:Вспомни интересное время 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 записей?
1. Первый запрос Task_id в пакетном режиме.
2. Затем проверьте t_task_exec_log одну за другой в соответствии с идентификатором задачи и отсортируйте ее, чтобы получить первые N записей.
3. Наконец, выполните конвергенцию данных и инкапсулируйте ее в формат данных, требуемый страницей.
Однако этот метод будет проходить через базу данных и обычно запрещен.
1. Первый запрос Task_id в пакетном режиме.
2. На основе этих идентификаторов задач выполните пакетный запрос строки набора log_id первых N записей каждой задачи из t_task_exec_log.
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 предметов
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 полоска
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 функция Выбиратьвзаимный 5 Результаты по полоска
Мы нашли и функцию окна возьмем взаимную 5 Результаты по полосканепоследовательный
Какой метод неправильный или оба метода неверны?
Давайте отрегулируем GROUP BY объединить MySQL функция Выбиратьвзаимный 5 полоскаиз写法
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 запятыми, чтобы получить строку
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 индивидуальный байт
Получить строку
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 子句后就变成окнофункция Понятно,Эффект восстановления очень интересный,Рекомендуется всем внимательно прочитать официальную документацию.