2017-03-28 11 views
0

値。注文は、私は、次のエンティティを持っている

ここでは、値を比較して出現回数を数えることによって、与えられた1つのプロジェクトに対して最適な一致するプロジェクトを見つける必要があります。例えばAttributeTypeとAttributeValueが一致すると、プロジェクトの「ベストマッチ」インジケータが1つ増えます。

どうすればいいですか?

答えて

0

私は類似点を照会する方法を見つけたと思う:

SELECT 
    sp.*, 
    ((
     SELECT COUNT(spa.id) FROM project_attribute AS spa WHERE spa.project = sp.id AND spa.attribute = pa.attribute AND spa.attribute_value = pa.attribute_value 
    ) * 1) 
    + 
    ((
     SELECT COUNT(spt.id) FROM project_task AS spt WHERE spt.project = sp.id AND spt.address = pt.address  
    ) * .25) 
    + 
    ((
     SELECT COUNT(spc.id) FROM project_campaign AS spc WHERE spc.project = sp.id AND spc.campaign = pc.campaign 
    ) * 2) 
    AS similarity 
FROM project AS p 
LEFT JOIN project_attribute AS pa ON (p.id = pa.project) 
LEFT JOIN project_task AS pt ON (p.id = pt.project) 
LEFT JOIN project_campaign AS pc ON (p.id = pc.project) 
LEFT JOIN project AS sp ON (p.id != sp.id) 
WHERE 
    p.id = <PROJECT-ID> 
GROUP BY sp.id 
ORDER BY 
    similarity DESC 

私も似た行の影響を制御する乗数を追加しました。

パフォーマンスは最高ではありませんが(235プロジェクトの場合は200msですが)、現在のニーズに合っています。

関連する問題