次のようなデータベースがあると仮定しましょう。
Project_tbl
:
----------------- id | Project_name ----------------- 1 | A 2 | B 3 | C -----------------
personel_project_tbl
:
-------------------- user_id | Project_id -------------------- 1 | 1 2 | 2 3 | 1 3 | 2 2 | 3 --------------------
instrument_project_tbl
:
-------------------------- Instrument_id | Project_id -------------------------- 1 | 1 1 | 2 2 | 2 2 | 1 1 | 3 --------------------------
次に、プロジェクトのリストを並べ替えて、プロジェクトAとの類似性に関してランク付けする必要があります。
例えば:
AとBには、3人のユーザーに対して1人のユーザーが共通しており、2人の楽器に対して2人の楽器があるため、類似性のランク付けは(1/2 + 2/2)/ 2 = 75%です。
AとCには共通のユーザーはありませんが、2つ以上の楽器があるため(1/2)/ 2 = 25%になります
したがって、Bはbeよりも類似しており、出力は
-------------- プロジェクト| ランク -------------- 2 | 75 3 | 25
それが私の頭に浮かんだ最初の解決策です...
PHPとMySQLでそれを行った場合、次のようになります。
for all tables as table_x
for all projects (except A) as prj_y
unique = (Select distinct count(items) from table_x where project is A)
count += (Select distinct count(items) from table_x
where project is prj_x and items are in
(select distinct items from table_x where project is a)
)/unique
したがって、複雑さはO(n 2)になり、インデックスを作成すると、選択のコストもO(log n)になり、手頃な価格にはなりません。
MySQLで完全に実行する、またはより適切で高速な方法で実行するアイデアはありますか?
********詳細と注意事項:**
私はPHPとMySQLに制限されています。
これは単なる例です。私の実際のプロジェクトでは、テーブルは20を超えるテーブルであるため、ソリューションは高性能である必要があります。
この質問は、この質問の補足質問です。yrソリューションを両方に使用または適用できる場合は、MySQLデータベースで最も繰り返される類似フィールドを取得します(どういうわけか)。関連するプロジェクトの価値にアイテムの類似性を掛けて、最良のオプションを取得したい...
結論として、これらの2つの質問は、最も関連性の高いプロジェクトを取得し、すべてのプロジェクトの類似アイテムを取得し、プロジェクトが現在のものと類似している現在のプロジェクトの最も類似したアイテムを見つけることです。よ
あなたの知的な答えに感謝します、あなたが状況にいくらかの光を当てることができればそれは本当にありがたいです