как выбрать записи с наиболее похожими атрибутами

horal

Новичок
как выбрать записи с наиболее похожими атрибутами

Есть событие, которое описывается с помощью 12-ти типов событий


то есть:
event:

type_1, type_2,....type_12
1 0 .... 1
0 1 1

тип имеет значение 0|1

нужно выбрать все записи, где есть хотя бы одно совпадение по типу, то есть

a: 1011
b: 0001

данные записи считаются совпавшими по типу 4.


то есть, это как двоичная арифметика, где нужный результат 1&1 = 1, остальные случаи - 0 (не подходят)

может как-то функцию можно сделать, чтобы она считала, или еще как.

как подступиться к данной задаче?

спасибо!
 

horal

Новичок
Re: как выбрать записи с наиболее похожими атрибутами

Автор оригинала: horal
Есть событие, которое описывается с помощью 12-ти типов событий


то есть:
event:

type_1, type_2,....type_12
1 0 .... 1
0 1 1

тип имеет значение 0|1

нужно выбрать все записи, где есть хотя бы одно совпадение по типу, то есть

a: 1011
b: 0001

данные записи считаются совпавшими по типу 4.


то есть, это как двоичная арифметика, где нужный результат 1&1 = 1, остальные случаи - 0 (не подходят)

может как-то функцию можно сделать, чтобы она считала, или еще как.

как подступиться к данной задаче?

все храниться в базе: либо Mysql либо Postgres (склоняемся ко второй)



спасибо!
 

horal

Новичок
Автор оригинала: Апокалипсис
покажи нормальную структуру таблицы
вот такая к примеру:

table

id 1 2 3 4 5 ... t12 - типы
1 1 0 1 0 1 ... 0
2 1 0 0 0 1 ... 0
3 0 1 0 1 1 ... 1
4 1 0 0 0 0 ... 1
5 0 0 0 1 0 ... 0
6 1 0 1 0 1 ... 0


нужно выбрать все строки, где есть 1 и более совпадение по типу

id = 1,2 = совпадают по t1, t5

может вообще не надо такая таблица, а можно что-либо другое придумать?

думал сделать фунцкию, которая делает число в результате, но как по нему сделать вывод? наверно функция не прокатит

фактически надо сравнивать каждую запись со всеми остальными.
 

phpdev2007

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

alexcrown

Новичок
Если типов всего 12 и не предполагается увеличение их количества, то храните поступайте образом.

Каждому типу соответствует степень двойки: первому типу 1, второму - 2, третьему - 4, двенадцатому - 2^12 = 4096. Тогда маска типов для события будет выглядеть как сумма всех соответствующих типов (это ваша двоичная маска в десятичной системе). В таблице вы храните только id и маску (type_mask)

Для выбора из базы всех событий, например, шестого типа (код 2^6=64) используйте запрос
SELECT * FROM events WHERE (type_mask & 64) = 64
 

horal

Новичок
Автор оригинала: alexcrown
Если типов всего 12 и не предполагается увеличение их количества, то храните поступайте образом.

Каждому типу соответствует степень двойки: первому типу 1, второму - 2, третьему - 4, двенадцатому - 2^12 = 4096. Тогда маска типов для события будет выглядеть как сумма всех соответствующих типов (это ваша двоичная маска в десятичной системе). В таблице вы храните только id и маску (type_mask)

Для выбора из базы всех событий, например, шестого типа (код 2^6=64) используйте запрос
SELECT * FROM events WHERE (type_mask & 64) = 64
Приведенный запрос просто выведет все события, где type6=1

а нужно выбрать все записи, который наиболее похожи друг на друга (то есть каждый с каждым наро сравнить)

то есть можно конечно, сделать так:

select * from events where t1=1

union all

select * from events where t2=1
union all

select * from events where t3=1

...

тогда получим список совпавших событий.

но это некрасивое и затратное решение (особенно по большой базе)

может как-то можно построить функцию близости?
 

Pigmeich

Новичок
horal
Во-первых, DESC в студию.

Во-вторых, тебе надо получить список пар записей похожих на друг друга или выдать все записи похожие на данную?
 

IIIEPJIOK

Новичок
Автор оригинала: horal
может как-то можно построить функцию близости?
а критерий близости какой
вот две пары:
111001011011 & 11100000000

111001011011 & 10100100000

"близость" в этих парах одинакова?
 

horal

Новичок
Автор оригинала: Pigmeich
horal
Во-первых, DESC в студию.

Во-вторых, тебе надо получить список пар записей похожих на друг друга или выдать все записи похожие на данную?
Есть объект о 12-ти атрибутах.

атрибутов конечное число:12

наличие атрибута:1
отсутствиие:0

Задача: среди множество объектов найти похожего, хотя бы по одному признаку.

То есть найти все объекты, с наличием одинаковых атрибутов.

если у А type1 =1 и у B type1 =1 - Они считаются похожими ( совпавшими)

Критерий: наличие одинаковых атрибутов в обоих объектов.

Если у Васи есть машина, и у Пети машина есть - то они похожи по признаку "есть машина"

Если у Васи есть машина, личный водитель, вилла на Карибах, и у Пети тоже самое, то они у нас похожи по 3-м признакам.


Надеюсь теперь я понятно выразился :)

*надо было сразу начать, но тогда была меньшая ясность понимания.

-~{}~ 04.12.07 12:34:

Автор оригинала: IIIEPJIOK
а критерий близости какой
вот две пары:
111001011011 & 11100000000

111001011011 & 10100100000

"близость" в этих парах одинакова?
сорри, не так выразился.

надо не близость, а похожесть по принципу наличия одинаковых атрибутов.
 

IIIEPJIOK

Новичок
Хм....я извиняюсь конечно и допускаю, что я туплю.......НО:
"похожесть" в мной приведенных парах одинакова? :)
или вообще все просто, если есть хотя б один совпадающий бит то они похожи и все, без всякой степени
 

horal

Новичок
Автор оригинала: IIIEPJIOK
Хм....я извиняюсь конечно и допускаю, что я туплю.......НО:
"похожесть" в мной приведенных парах одинакова? :)
или вообще все просто, если есть хотя б один совпадающий бит то они похожи и все, без всякой степени
степени будут отдельно ставится.

"похожесть" тут может , не совсем верный термин.

скорее наличии одинаковых признаков у разных объектов.
 

totamon

Новичок
имхо, вы не стой стороны заходите...
ну вывалится у вас весь список "похожих" строк... вы представляете сколько их может быть? высшая математика уже успешно забылась, и конечно зависит от общего числа строк), но перебор комбинаций по параметрам от 2 до 12 это по-моему чтото из области произведения факториалов))) - те очень много...
может стоит начать с формулировки задачи, а не способа которым вы придумали ее решить?
 

Pigmeich

Новичок
horal
я про вывод команды DESC спрашивал. Просто я пока не понимаю как это все хранится.
 

IIIEPJIOK

Новичок
totamon
те очень много...
ну, вданном случае всего 4096....не так чтоб уж очень много
horal

скорее наличии одинаковых признаков у разных объектов.
Ну, тогда я б обратил ваше внимание на пост
Автор оригинала: alexcrown
Если типов всего 12 и не предполагается увеличение их количества, то храните поступайте образом.

Каждому типу соответствует степень двойки: первому типу 1, второму - 2, третьему - 4, двенадцатому - 2^12 = 4096. Тогда маска типов для события будет выглядеть как сумма всех соответствующих типов (это ваша двоичная маска в десятичной системе). В таблице вы храните только id и маску (type_mask)

Для выбора из базы всех событий, например, шестого типа (код 2^6=64) используйте запрос
SELECT * FROM events WHERE (type_mask & 64) = 64
тока с некоторыми дополнениями:
путь маска вашего события eventMask, тогда
[sql]SELECT id, (type_mask & eventMask) as coincidence FROM events WHERE (type_mask & eventMask) > 0 [/sql]
вы получите все варианты, где есть хотя б одно совпадение. О количестве совпавших битов можно судить по столбцу coincidence.
Ну, а дальше можно определять степень "похожести", как вам этого хочется и как вы это определяете
 
Сверху