Кажется, есть проблемы, подобные этому, но не совсем. Я попытался спуститься по этому пути ( сравните наборы данных и вернем лучшее совпадение ), но оказался в тупике.
Мне нужно взять набор и найти лучший набор соответствия. Итак, скажем, у нас есть search_obj, который содержит значения (1, 4, 29, 44, 378, 379). Я хотел бы найти другие объекты с одинаковыми значениями и в идеале найти тот, который лучше всего соответствует этому. Будет большое количество других объектов, поэтому производительность вызывает большую озабоченность.
В настоящее время я работаю в php и mysql, но я желаю изменить это, если это означает лучшую производительность.
Спасибо за любую помощь.
Мне просто пришло в голову:
Предположим, у вас есть таблица уникальных пар (a, b):
CREATE table t1 (a INT, b INT, PRIMARY KEY (a, b));
Теперь вы заполните его:
INSERT INTO t1 VALUES (1,1), (1,2), -- item to compare with (2,1), (2,3), -- has one common prop with 1 (3,1), (3,2), -- has the same props as 1 (4,1), (4,2), (4,3), (4,4); -- has 2 same props with 1
Следующий запрос будет заказывать другие предметы в соответствии с подобием:
SELECT t1.a, COUNT(t2.a) as same_props_count, ABS(COUNT(t2.a) - COUNT(*)) as diff_count FROM t1 LEFT JOIN t1 as t2 ON t1.b = t2.b and t2.a = 1 WHERE t1.a <> 1 GROUP BY t1.a ORDER BY same_props_count DESC, diff_count; a, same_props_count, diff_count 3, 2, 0 4, 2, 2 2, 1, 1
Вы можете вычислить пересечение двух массивов с помощью array_intersect
, который возвращает значения первого массива, которые присутствуют во втором. Если вы сравниваете несколько списков, вы можете использовать длину возвращаемого массива (т. Е. Чем больше длина, тем ближе пересечение, тем ближе к совпадению).