powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / FAQ: обработка строк и парсинг текстов средствами MySQL
33 сообщений из 33, показаны все 2 страниц
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817663
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот ... прошло 2 года с тех пор как занялся прсингом текстов силами Мускуля ... предлагаю организовать ФАК по работе с текстами и особенностях применения Locate(), Replace(), Find_in_set(), Substring_index() и прочих прелестей...

Для начала:

Запрос "разбивка текстового поля на слова по пробелу" (первые 10 слов):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  SELECT
    tmp.`id` AS `num`
    , SUBSTRING_INDEX(SUBSTRING_INDEX(src.`text_field`, ' ', tmp.`id`), ' ', -1) AS `word`
    , src.`text_field` AS source
  FROM (
    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
  ) AS tmp
  JOIN `text_table` AS src
  HAVING `word` <> ''



При необходимости можно заменить пробел чем-то другим - просто заменив вхождения его в обе функции как строки-разделителя.
При необходимости можно создать отдельную табличку с чиселками и джойниться к ней и находить и большее количество слов или джойнить две таких группы для поиска до сотни слов или три для поиска до тысячи слов или ... :)

Недостаток запроса - он выдает всегда то количество слов, скока цифирек сджойнено, и, если слов меньше - тупо повторяет последнее слово... как "поправить" - предлагаю дополнить после выделения темы.

... продолжение "типовых" запросов по текстовой обработке для начинающих - привествуется.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817673
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

да, хороший вариант. Он уже представлен
по ссылке прямо в предыдушем посте 13640230 ,
там показан полный пример со джоинтом и
сравнение с другими способами решения.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817674
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109ну вот ... прошло 2 года с тех пор как занялся прсингом текстов силами Мускуля ... предлагаю организовать ФАК по работе с текстами и особенностях применения Locate(), Replace(), Find_in_set(), Substring_index() и прочих прелестей...В целом я только за!
Возьметесь написать стартовый пост?

P.S. Хотя сам парсинг силами MySQL мне кажется весьма неэффективным по скорости и ресурсам.

Arhat109Недостаток запроса - он выдает всегда то количество слов, скока цифирек сджойнено, и, если слов меньше - тупо повторяет последнее слово... как "поправить" - предлагаю дополнить после выделения темы.А если в конец строки добить 9 пробелов?

Arhat109... продолжение "типовых" запросов по текстовой обработке для начинающих - привествуется. 15921841 годится? буквально вчера было...
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817693
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc,

ну ... ваш запрос оригинален (снимаю шляпу :) ) и кажется вполне рабочим, но как понимаю применим к конкретной задаче хранения листьев в деревьях всеж-таки (как не надо делать).

Я имел ввиду общую обработку текстов силами Мускуля.

Например, часто требуется найти "похожие" строки, по алгоритму, отличному от full text search ... и народ часто решает вопрос путем выкачки данных в приложение и ваяет циклы на ЯП (С, PHP, кто на чем горазд).

На самом деле, часто обработка внутри Мускуля может оказаться даже быстрее. Недостаток один - это как правило запросы типа "выверни моск наизнанку"... вот поэтому и предлагаю вынести и прикрепить в отдельной теме. Задолбало за 2 года разыскивать в своем коде эти чудесатые подходы, типа как запрос, что привел выше.

Озадачился что тут нет такого фака, поскольку потерял свой запрос по разбивке товарной строки на слова, по заданному набору разделителей ("по или", а не одному!) из вспомогательной таблички с поиском полученных слов в словаре Зализняка и получением результата в виде:

порядок, слово, часть_речи (если найдена).

:)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817699
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Предлагаю вынести мой пост в отдельный ФАК "для начала", а потом усложнять запрос постепенно до вменяемого результата. :)

Вряд ли сподоблюсь написать целую статью ... ни умею. :)

Я делал ограничение через переменные: как только "предыдущее" слово равно "новому" - значит "кончились". :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817702
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109словарь ЗализнякаИз одного этого только словосочетания нужно сделать, как минимум, отдельный пост. А то и топик! :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817703
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109Я делал ограничение через переменные: как только "предыдущее" слово равно "новому" - значит "кончились". :)А если по факту будут одинаковые слова? Да еще в середине строки?
(У меня реально встречается, что одно слово в наименовании товара встречается даже трижды).
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817713
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109Предлагаю вынести мой пост в отдельный ФАК "для начала", а потом усложнять запрос постепенно до вменяемого результата. :)Выделил.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817740
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft, Упс. Не было такого... да, тогда это работать будет некорректно:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT
    tmp.`id` AS `num`
    , IF( @old <> (@new:=SUBSTRING_INDEX(SUBSTRING_INDEX(src.`text_field`, ' ', tmp.`id`), ' ', -1))
      , @old:=@new
      , ''
    ) AS `word`
    , src.`text_field` AS source
  FROM
  (SELECT @old:=@new:='') AS dummy
  ,(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
  ) AS tmp
  , `text_table` AS src
  HAVING `word` <> ''



точнее он отдаст все одинаковые слова ровно по одному разу... :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817747
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

уточнение: "все одинаковые слова, стоящие подряд". Если они перемежаются другими словами, то выдаст "как надо". :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817753
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109точнее он отдаст все одинаковые слова ровно по одному разу... :)Еще точнее - сократит одинаковые слова, идущие подряд в порядке чисел в результате подзапроса tmp, который внезапно может измениться, особенно если использовать настоящую таблицу.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817755
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109Arhat109,

уточнение: "все одинаковые слова, стоящие подряд". Если они перемежаются другими словами, то выдаст "как надо". :)я опоздал с уточнением :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817772
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такой вариант неожиданно, но работает верно (MySql 5.1.67? не помню какой стоит...)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT
    tmp.`id` AS `num`
    , SUBSTRING_INDEX(@new:=SUBSTRING_INDEX(src.`text_field`, ' ', tmp.`id`), ' ', -1) AS `word`
    , src.`text_field` AS source
  FROM
  (SELECT @new:='') AS dummy
  ,(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
  ) AS tmp
  , `text_table` AS src
  WHERE CHAR_LENGTH(@new) < CHAR_LENGTH(src.`text_field`)



, хотя "по идее" должен глотать последнее слово...
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817967
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался. Работает верно, потому что блок проверки WHERE обрабатывается ранее блока выборки SELECT в силу оптимизации выполнения запроса. Логично, но не уверен что можно рекомендовать в ФАК.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817972
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109Разобрался. Работает верно, потому что блок проверки WHERE обрабатывается ранее блока выборки SELECT в силу оптимизации выполнения запроса. Логично, но не уверен что можно рекомендовать в ФАК.


...это извесное правило: применение переменных в WHERE
категорически запрешено всем кроме Бочкова.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818006
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc, использовать можно. Изменять нельзя. :)

Продолжаем. Наткнулся на вот это обсуждение: 16690327 по вопросу построения "сочинителя сказок" силами Мускуля, как понял задачу. Думаю дать ссылку тут - будет полезно.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818020
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача2: обрезать последнее слово в строке:

TRIM(TRAILING SUBSTRING_INDEX(#string#, #pattern#, -1) FROM #string#)

обсуждение тут: 15548673
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818083
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftArhat109словарь ЗализнякаИз одного этого только словосочетания нужно сделать, как минимум, отдельный пост. А то и топик! :)

нашел. Начало было тут: 13369064
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818113
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжаем сбор "полезностей" по работе с текстами. Нашел вот это:

Есть таблица с полем `name`. В поле хранятся записи вида А. Пупкин, А. В. Бубликов и т.д. Проблема в том, что сортировать их нужно по фамилии, а потом по инициалам. Хранить имя, отчество и фамилию в разных полях или в другом порядке - не вариант, нужно работать с полем такого вида. В результате непродолжительных раздумий, родил запрос вида

Код: sql
1.
SELECT ... ORDER BY SUBSTR(`name`, - (LOCATE('.', REVERSE(`name`)) - 2)), `name`;



Взято тут 12800557
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818670
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109javajdbc, использовать можно. Изменять нельзя. :)


В обшем виде -- НЕЛЬЗЯ.

Попробуем классифицировать контекстЫ
для переменных. Нужна стабильность и предсказуемость.

1-1. Стабильно. Порядок вычисления внутри функций:
Например, LEAST(A, B, C) всегда вычисляется слева направо.

1-2. Стабильно. Порядок вычисления строчек в SELECT блоке
при наличии ORDER BY и отсутствии GROUP BY. Если есть ГРОУП БУ
то надо вынести ORDER BY в окружной селект.

2. Недокументировано, но стабильно. Порядок вычисления полей
в SELECT блоке. Т.е. SELECT A, B, C FROM... вычисляет
A, B, C в указаном порядке. Стандарты СКЛ и MYSQL документация
никак не прописывают порядок. Однако я не видел ни одного
отрицательного примера.

Параноикам советуется использование способа (1-1) вместо (2).

3-1. Нестабильно. порядок выполнения вычислений в WHERE и JOIN ON блоке.
В литературе в ЯВНОМ виде показано как ломаются вычисления с переменными.
Из-за того что порядок зависит от плана.
Из-за того что план зависит от статистики, индексов и фазы луны.

3-2. Нестабильно. Использовать переменные в SELЕCT и WHERE блоках
одновремено. Во-первых (3), во вторых даже если в WHERE
только читать переменную, все равно не доказан строгий ход
вычислений между двумя блоками.

В целом -- мускл переменные -- полезная но капризная штука.
Попытки использования переменных в "нестабильном" контексте
приводит к "нестабильным" результатам.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818765
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc, согласен. В целом, переменные в запросе - это не совсем скуль где-то даже... но, многое что можно сделать в части парсинга текстов - без них, увы силами "чистого sql", возможно и не решаемо совсем.

В частности, разбивка строки на слова не по пробелу или другому одиночному символу, а по заданному набору разделителей - как?

Пример:

Альб д/рис,40л.,картон-А4,"Алые Паруса"

надо получить:
Альб -- вид товара
д/рис -- подвид товара
40л. -- параметр "количество листов"
картон -- параметр "материал обложки"
А4 -- параметр "формат"
"Алые Паруса" -- параметр "картинка на обложке"

Разделители: пробел, запятая, тире.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818776
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

Ну с разделителями -- достаточно просто :
свести все разделители к одному путем
нескольких замен -- пробел на запятую,
точку на запятую....
а потом разбивать по запятой как мы уже знаем...
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818982
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc,

Можно. Предположим что список разделителей лежит в табличке. Запрос, который делает замену в строке одной таблички по набору записей образцов из другой - приведете? (потом усложню задачу) :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39194948
Фотография blogger1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,
все одинаковые слова, стоящие подряд". Если они перемежаются другими словами, то выдаст "как надо". :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39196314
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

этот весь топик - извращение какое-то,
разбирать текст надо не на SQL, для этого полно средств от строковых функций и регулярных выражений до компиляторов и их генераторов.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39229543
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эту конструкцию
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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



можно заменить на
Код: sql
1.
2.
3.
4.
5.
SET @d = 0;
SELECT
  @d := @d+1 AS d
FROM любая_таблица
WHERE @d < 10
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39229645
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это хорошо, когда есть под рукой "любая таблица" с достаточным количеством записей... а то к INFORMATION_SCHEMA придётся обращаться - как бы некрасиво...
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39323166
Фотография paha4444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

100% жесть полная! Интересно, если БД огромная то сколько займут времени такие запросы....
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39604106
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paha4444,

Жесть конечно, но практика показывает что разбор текстов запросами выполняется примерно за то же самое время что и выборка из таблицы + запрос средствами клиента на ЯВУ а в ряде случаев и шустрее. Как ни странно. :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39650659
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла задача парсинга данных в MySQL.
Нашел проблему в использовании алгоритма стартового поста.

Пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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 по ; и записать данные в другую таблицу, сгруппировав по тексту.

Т.е. я должен получить такое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
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


Но для начала хотя бы такое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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'




Делаю запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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` <> ''



Он возвращает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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) получаются типа равнозначными по кол-ву записей...

У кого-то есть подходящий вариант решения или задачу надо передавать на клиентский уровень? :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39650661
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла задача парсинга данных в MySQL.
Нашел проблему в использовании алгоритма стартового поста.

Пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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 по ; и записать данные в другую таблицу, сгруппировав по тексту.

Т.е. я должен получить такое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
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


Но для начала хотя бы такое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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'




Делаю запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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` <> ''



Он возвращает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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) получаются типа равнозначными по кол-ву записей...

У кого-то есть подходящий вариант решения или задачу надо передавать на клиентский уровень? :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39930770
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то обратил внимание, что на дворе давно восьмая версия, а никто не шевелится. А она принесла много нового, в том числе и новые подходы к парсингу CSV-полей.

Ну собственно не буду много говорить, думаю, примеров более чем достаточно.

Исходные данные:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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 |
+---------------+



Ну, понеслася...

Парсинг с сохранением исходных:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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     |
+---------------+-------+



Только распарсенные данные:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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   |
+-------+



Если кому не нравится, что визуальные числа сортируются как строки - ноль прибавляйте сами.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FAQ: обработка строк и парсинг текстов средствами MySQL
    #40077331
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

CAST в ORDER BY исправит сортировку?
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / FAQ: обработка строк и парсинг текстов средствами MySQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]