Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / MySQL |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 [2] все |
вадя Member Откуда: Екатеринбург Сообщений: 18766 |
эту конструкциюSELECT 1 AS num UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL можно заменить на SET @d = 0; SELECT @d := @d+1 AS d FROM любая_таблица WHERE @d < 10 |
5 май 16, 05:22 [19136394] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
Это хорошо, когда есть под рукой "любая таблица" с достаточным количеством записей... а то к INFORMATION_SCHEMA придётся обращаться - как бы некрасиво... |
5 май 16, 10:29 [19137011] Ответить | Цитировать Сообщить модератору |
paha4444 Member Откуда: Украина Одесская обл., Рени Сообщений: 69 |
MasterZiv, 100% жесть полная! Интересно, если БД огромная то сколько займут времени такие запросы.... |
8 окт 16, 08:58 [19758447] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
Arhat109 Member Откуда: из СССР Сообщений: 3428 |
paha4444, Жесть конечно, но практика показывает что разбор текстов запросами выполняется примерно за то же самое время что и выборка из таблицы + запрос средствами клиента на ЯВУ а в ряде случаев и шустрее. Как ни странно. :) |
19 фев 18, 12:53 [21201562] Ответить | Цитировать Сообщить модератору |
Megabyte Member Откуда: ближайшее заМКАДье Сообщений: 4972 |
Возникла задача парсинга данных в MySQL. Нашел проблему в использовании алгоритма стартового поста. Пример: create table tbl( id int, data varchar(100) ); insert into tbl values(1, 'vasya pupkin;vasya pupkin;vasya pupkin'); insert into tbl values(2, 'vasya pupkin'); insert into tbl values(3, 'vasya pupkin;petya petrov'); Надо разбить поле data по ; и записать данные в другую таблицу, сгруппировав по тексту. Т.е. я должен получить такое: SELECT 1, 'vasya pupkin', 3 UNION ALL SELECT 2, 'vasya pupkin', 1 UNION ALL SELECT 3, 'vasya pupkin', 1 UNION ALL SELECT 3, 'petya petrov', 1 Но для начала хотя бы такое: SELECT 1, 'vasya pupkin' UNION ALL SELECT 1, 'vasya pupkin' UNION ALL SELECT 1, 'vasya pupkin' UNION ALL SELECT 2, 'vasya pupkin' UNION ALL SELECT 3, 'vasya pupkin' UNION ALL SELECT 3, 'petya petrov' Делаю запрос: SELECT tmp.`num` AS `num` ,`id` , SUBSTRING_INDEX(SUBSTRING_INDEX(src.`data`, ';', tmp.`num`), ';', -1) AS `word` FROM ( SELECT 1 AS num UNION ALL SELECT 2 UNION ALL SELECT 3 ) AS tmp JOIN `tbl` AS src HAVING `word` <> '' Он возвращает: SELECT 1, 'vasya pupkin' UNION ALL SELECT 1, 'vasya pupkin' UNION ALL SELECT 1, 'vasya pupkin' UNION ALL SELECT 2, 'vasya pupkin' UNION ALL SELECT 2, 'vasya pupkin' UNION ALL SELECT 2, 'vasya pupkin' UNION ALL SELECT 3, 'vasya pupkin' UNION ALL SELECT 3, 'petya petrov' UNION ALL SELECT 3, 'petya petrov' Т.е. всегда 3 записи, независимо от реального кол-ва разбиений. В итоге у меня записи с ID IN (1, 2) получаются типа равнозначными по кол-ву записей... У кого-то есть подходящий вариант решения или задачу надо передавать на клиентский уровень? :) |
27 май 18, 15:41 [21444104] Ответить | Цитировать Сообщить модератору |
Megabyte Member Откуда: ближайшее заМКАДье Сообщений: 4972 |
Возникла задача парсинга данных в MySQL. Нашел проблему в использовании алгоритма стартового поста. Пример: create table tbl( id int, data varchar(100) ); insert into tbl values(1, 'vasya pupkin;vasya pupkin;vasya pupkin'); insert into tbl values(2, 'vasya pupkin'); insert into tbl values(3, 'vasya pupkin;petya petrov'); Надо разбить поле data по ; и записать данные в другую таблицу, сгруппировав по тексту. Т.е. я должен получить такое: SELECT 1, 'vasya pupkin', 3 UNION ALL SELECT 2, 'vasya pupkin', 1 UNION ALL SELECT 3, 'vasya pupkin', 1 UNION ALL SELECT 3, 'petya petrov', 1 Но для начала хотя бы такое: SELECT 1, 'vasya pupkin' UNION ALL SELECT 1, 'vasya pupkin' UNION ALL SELECT 1, 'vasya pupkin' UNION ALL SELECT 2, 'vasya pupkin' UNION ALL SELECT 3, 'vasya pupkin' UNION ALL SELECT 3, 'petya petrov' Делаю запрос: SELECT tmp.`num` AS `num` ,`id` , SUBSTRING_INDEX(SUBSTRING_INDEX(src.`data`, ';', tmp.`num`), ';', -1) AS `word` FROM ( SELECT 1 AS num UNION ALL SELECT 2 UNION ALL SELECT 3 ) AS tmp JOIN `tbl` AS src HAVING `word` <> '' Он возвращает: SELECT 1, 'vasya pupkin' UNION ALL SELECT 1, 'vasya pupkin' UNION ALL SELECT 1, 'vasya pupkin' UNION ALL SELECT 2, 'vasya pupkin' UNION ALL SELECT 2, 'vasya pupkin' UNION ALL SELECT 2, 'vasya pupkin' UNION ALL SELECT 3, 'vasya pupkin' UNION ALL SELECT 3, 'petya petrov' UNION ALL SELECT 3, 'petya petrov' Т.е. всегда 3 записи, независимо от реального кол-ва разбиений. В итоге у меня записи с ID IN (1, 2) получаются типа равнозначными по кол-ву записей... У кого-то есть подходящий вариант решения или задачу надо передавать на клиентский уровень? :) |
27 май 18, 15:45 [21444107] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
Что-то обратил внимание, что на дворе давно восьмая версия, а никто не шевелится. А она принесла много нового, в том числе и новые подходы к парсингу CSV-полей. Ну собственно не буду много говорить, думаю, примеров более чем достаточно. Исходные данные: CREATE TABLE test (csv TEXT); INSERT INTO test VALUES ('1,22,333'),('4,55,666,55,4'); SELECT * FROM test; +---------------+ | csv | +---------------+ | 1,22,333 | +---------------+ | 4,55,666,55,4 | +---------------+ Ну, понеслася... Парсинг с сохранением исходных: SELECT * FROM test CROSS JOIN JSON_TABLE( CONCAT('[', test.csv, ']'), "$[*]" COLUMNS( value VARCHAR(254) PATH "$" ) ) AS jsontable; +---------------+-------+ | csv | value | +---------------+-------+ | 1,22,333 | 1 | +---------------+-------+ | 1,22,333 | 22 | +---------------+-------+ | 1,22,333 | 333 | +---------------+-------+ | 4,55,666,55,4 | 4 | +---------------+-------+ | 4,55,666,55,4 | 55 | +---------------+-------+ | 4,55,666,55,4 | 666 | +---------------+-------+ | 4,55,666,55,4 | 55 | +---------------+-------+ | 4,55,666,55,4 | 4 | +---------------+-------+ Только распарсенные данные: SELECT jsontable.value FROM test CROSS JOIN JSON_TABLE( CONCAT('[', test.csv, ']'), "$[*]" COLUMNS( value VARCHAR(254) PATH "$" ) ) AS jsontable; +-------+ | value | +-------+ | 1 | +-------+ | 22 | +-------+ | 333 | +-------+ | 4 | +-------+ | 55 | +-------+ | 666 | +-------+ | 55 | +-------+ | 4 | +-------+ Ну и вишенка на торте - DISTINCT и ORDER BY: SELECT DISTINCT jsontable.value FROM test CROSS JOIN JSON_TABLE( CONCAT('[', test.csv, ']'), "$[*]" COLUMNS( value VARCHAR(254) PATH "$" ) ) AS jsontable ORDER BY jsontable.value; +-------+ | value | +-------+ | 1 | +-------+ | 22 | +-------+ | 333 | +-------+ | 4 | +-------+ | 55 | +-------+ | 666 | +-------+ Если кому не нравится, что визуальные числа сортируются как строки - ноль прибавляйте сами. |
25 фев 20, 20:59 [22086822] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 [2] все |
Все форумы / MySQL | ![]() |