powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка данных по шаблону
16 сообщений из 16, страница 1 из 1
Выборка данных по шаблону
    #38451746
Solomo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Шаблон поиска по колонке id_points:
11305,11306,11488,11308,11309,11310,11311,11312,11313,11314,11315,11316,11317,11318,11319,11320,45574,11322,45572,11324,11325,11326,11327,11328

Необходимо выбрать данные, если в id_points есть любые пересечения с шаблоном. Например:

1. Строки полностью включающие в себя шаблон
а) 6457,234,1234,11305,11306,11488,11308,11309,11310,11311,11312,11313,11314,11315,11316,11317,11318,11319,11320,45574,11322,45572,11324,11325,11326,11327,11328,7213,123
б) 11305,11306,11488,11308,11309,11310,11311,11312,11313,11314,11315,11316,11317,11318,11319,11320,45574,11322,45572,11324,11325,11326,11327,11328,7213,123
в) 6457,234,1234,11305,11306,11488,11308,11309,11310,11311,11312,11313,11314,11315,11316,11317,11318,11319,11320,45574,11322,45572,11324,11325,11326,11327,11328

2. Строки, включающие в себя часть шаблона:
а) 11305,11306,11488,11308
б) 11311,11312,11313,11314,11315,11316,6457,234
в) 45671,3456,11305,11306,11488,11308,6457,234

Мой запрос часть выборок не делает, помогите, пожалуйста, разобраться, как верно прописать условия:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT * FROM 
	( SELECT r1.id_user, r1.id_req FROM points r1, ( SELECT id_points, id_req FROM points WHERE id_req in (SELECT id_req FROM requests WHERE id_user=53964 and id_req=817) AND id_points !='' ORDER BY id_req limit 0,30 ) r2 
		WHERE 
			r1.id_user<>53964 
		AND 
			r2.id_points != '' 
		AND 
			r1.id_points != '' 
		AND 
			( r1.id_points LIKE CONCAT('%',r2.id_points,'%') OR r2.id_points LIKE CONCAT('%',r1.id_points,'%') ) ORDER BY id_user desc 
	)
A GROUP BY id_user
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38451755
Solomo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Убрал лишний подзапрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT * FROM 
	( SELECT r1.id_user, r1.id_req FROM points r1, ( SELECT id_points, id_req FROM points WHERE id_req=817 AND id_points !='' ORDER BY id_req limit 0,30 ) r2 
		WHERE 
			r1.id_user<>53964 
		AND 
			r2.id_points != '' 
		AND 
			r1.id_points != '' 
		AND 
			( r1.id_points LIKE CONCAT('%',r2.id_points,'%') OR r2.id_points LIKE CONCAT('%',r1.id_points,'%') ) ORDER BY id_user desc 
	)
A GROUP BY id_user
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38452027
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это явно задача на поиск наибольшей общей подстроки. И она не для SQL...
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38452142
Solomo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, не нужна наибольшая. Нужны все подстроки
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38452189
Solomo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно выше непонятно написано. Попробую показать на примере, когда нужно найти подстроку:

Надо найти все строки в колонке id_points содержащие любую часть этой строки или содержащиеся в этой строке: 11305,11306,11488,11308,11309,11310,11311,11312,11313,11314,11315,11316,11317,11318,11319,11320,45574,11322,45572,11324,11325,11326,11327,11328

Ручным перебором в таблице была найдена одна строка, содержится подстроку указанной выше строки. Подстрока выделена красным: 2355,2356,2357,2358,2359,2360,2361,2362,3140,2364,2365,11305,11306,11488,11308,11309,11310,11311,11312,11313,11314,11315,11316,11354,11353,8626,48265,1781

Как сформировать запрос sql, который найдет эту строку с подстрокой?
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38452197
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolomoAkina, не нужна наибольшая. Нужны все подстрокиЖелательно не только прочитать ответ, но и постараться понять его.
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38452212
Solomo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, так я и пытался. Выше привел пример. Этот пример реализуем на sql?
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38452255
Solomo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, дошло о чем вы. Какими средствами это можно реализовать? Данные хранятся в mysql....
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38452258
Solomo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В таблице более миллиона записей
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38452527
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... вариантов, собственно, немного.
Первый - это нарисовать собственную функцию поиска этой общей подстроки. Лучше как UDF...
Второй - вывалить это барахло на клиента, и пусть сам ищет что ему требуется.
Если всё это происходит в рамках одного хоста - оба варианта допустимы. Ну а если нет - то только первый...

В общем, см. http://algolist.manual.ru/search/lcs/index.php
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38452626
Solomo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, в каком из двух случаев поиск будет быстрее?
С UDF не знаком. Это оно http://www.ibase.ru/devinfo/udf_ok.htm ? Верно понимаю, что тут своя функция будет обращаться к той же бд?
И второй вариант, имеется ввиду вытащить из таблицы все данные в массив и искать по массиву? Объем данных большой (сейчас более миллиона, а будет еще больше). Я так понимаю на этапе только выгрузки из базы, будет тормозить. Как увеличить скорость выборки?
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38452697
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
имхо, нормализовывать нужно это "кшмат" ТС !!
а потом уже искать решение ...

извиняюсь, что на МС СКЛ, но тут всё стандартное
Код: 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.
26.
27.
28.
declare @t table (id_path int, order_in_path int, id_point int) --	станции маршрутов
declare @search table (order_in_path int, id_point int)			--	искомый маршрут

insert into @t 
select 1, 1, 11305 union all
select 1, 2, 11306 union all
select 1, 3, 11488 union all
select 1, 4, 11308 union all
select 1, 5, 11309 union all
select 1, 6, 11310 union all
select 2, 1, 11311 union all
select 2, 2, 11312 union all
select 2, 3, 11313 union all
select 2, 4, 11314

insert into @search 
select 1, 11488 union all
select 2, 11308 union all
select 3, 11309 union all
select 4, 11311 union all
select 5, 11312 union all
select 6, 11313 union all
select 7, 11314 union all
select 8, 11315

select t.id_path, count(*) as cnt_point /*, group_concat(t.id_point order by t.order_in_path) */
from @t t inner join @search s on t.id_point=s.id_point
group by t.id_path, t.order_in_path-s.order_in_path


Код: sql
1.
2.
3.
4.
id_path     cnt_point
----------- -----------
2           4
1           3
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38452756
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112 , ты не учитываешь, что у него ещё и порядок элементов в подстроке важен.
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38452765
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina qwerty112 , ты не учитываешь, что у него ещё и порядок элементов в подстроке важен.
учитываю,
это контролируется группировкой по t.order_in_path-s.order_in_path
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38452776
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112Akina qwerty112 , ты не учитываешь, что у него ещё и порядок элементов в подстроке важен.
учитываю,
это контролируется группировкой по t.order_in_path-s.order_in_path
вот, переставил 2-а поинта местами
Код: 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.
26.
27.
28.
declare @t table (id_path int, order_in_path int, id_point int) --	станции маршрутов
declare @search table (order_in_path int, id_point int)			--	искомый маршрут

insert into @t 
select 1, 1, 11305 union all
select 1, 2, 11306 union all
select 1, 3, 11488 union all
select 1, 4, 11309 union all
select 1, 5, 11308 union all
select 1, 6, 11310 union all
select 2, 1, 11311 union all
select 2, 2, 11312 union all
select 2, 3, 11313 union all
select 2, 4, 11314

insert into @search 
select 1, 11488 union all
select 2, 11308 union all
select 3, 11309 union all
select 4, 11311 union all
select 5, 11312 union all
select 6, 11313 union all
select 7, 11314 union all
select 8, 11315

select t.id_path, count(*) as cnt_point /*, group_concat(t.id_point order by t.order_in_path) */
from @t t inner join @search s on t.id_point=s.id_point
group by t.id_path, t.order_in_path-s.order_in_path


Код: sql
1.
2.
3.
4.
5.
6.
id_path     cnt_point
----------- -----------
2           4
1           1
1           1
1           1
...
Рейтинг: 0 / 0
Выборка данных по шаблону
    #38452791
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, был невнимателен...
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка данных по шаблону
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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