Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка данных по шаблону / 16 сообщений из 16, страница 1 из 1
04.11.2013, 13:18:25
    #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
04.11.2013, 13:27:25
    #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
04.11.2013, 16:56:37
    #38452027
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по шаблону
Это явно задача на поиск наибольшей общей подстроки. И она не для SQL...
...
Рейтинг: 0 / 0
04.11.2013, 18:30:43
    #38452142
Solomo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по шаблону
Akina, не нужна наибольшая. Нужны все подстроки
...
Рейтинг: 0 / 0
04.11.2013, 19:22:19
    #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
04.11.2013, 19:27:54
    #38452197
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по шаблону
SolomoAkina, не нужна наибольшая. Нужны все подстрокиЖелательно не только прочитать ответ, но и постараться понять его.
...
Рейтинг: 0 / 0
04.11.2013, 19:37:39
    #38452212
Solomo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по шаблону
Akina, так я и пытался. Выше привел пример. Этот пример реализуем на sql?
...
Рейтинг: 0 / 0
04.11.2013, 20:29:22
    #38452255
Solomo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по шаблону
Akina, дошло о чем вы. Какими средствами это можно реализовать? Данные хранятся в mysql....
...
Рейтинг: 0 / 0
04.11.2013, 20:30:15
    #38452258
Solomo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по шаблону
В таблице более миллиона записей
...
Рейтинг: 0 / 0
05.11.2013, 09:12:15
    #38452527
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по шаблону
Ну... вариантов, собственно, немного.
Первый - это нарисовать собственную функцию поиска этой общей подстроки. Лучше как UDF...
Второй - вывалить это барахло на клиента, и пусть сам ищет что ему требуется.
Если всё это происходит в рамках одного хоста - оба варианта допустимы. Ну а если нет - то только первый...

В общем, см. http://algolist.manual.ru/search/lcs/index.php
...
Рейтинг: 0 / 0
05.11.2013, 10:40:55
    #38452626
Solomo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по шаблону
Akina, в каком из двух случаев поиск будет быстрее?
С UDF не знаком. Это оно http://www.ibase.ru/devinfo/udf_ok.htm ? Верно понимаю, что тут своя функция будет обращаться к той же бд?
И второй вариант, имеется ввиду вытащить из таблицы все данные в массив и искать по массиву? Объем данных большой (сейчас более миллиона, а будет еще больше). Я так понимаю на этапе только выгрузки из базы, будет тормозить. Как увеличить скорость выборки?
...
Рейтинг: 0 / 0
05.11.2013, 11:34:56
    #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
05.11.2013, 12:06:50
    #38452756
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по шаблону
qwerty112 , ты не учитываешь, что у него ещё и порядок элементов в подстроке важен.
...
Рейтинг: 0 / 0
05.11.2013, 12:09:00
    #38452765
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по шаблону
Akina qwerty112 , ты не учитываешь, что у него ещё и порядок элементов в подстроке важен.
учитываю,
это контролируется группировкой по t.order_in_path-s.order_in_path
...
Рейтинг: 0 / 0
05.11.2013, 12:13:19
    #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
05.11.2013, 12:21:58
    #38452791
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по шаблону
Пардон, был невнимателен...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка данных по шаблону / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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