0
ここでは、値を比較して出現回数を数えることによって、与えられた1つのプロジェクトに対して最適な一致するプロジェクトを見つける必要があります。例えばAttributeTypeとAttributeValueが一致すると、プロジェクトの「ベストマッチ」インジケータが1つ増えます。
どうすればいいですか?
ここでは、値を比較して出現回数を数えることによって、与えられた1つのプロジェクトに対して最適な一致するプロジェクトを見つける必要があります。例えばAttributeTypeとAttributeValueが一致すると、プロジェクトの「ベストマッチ」インジケータが1つ増えます。
どうすればいいですか?
私は類似点を照会する方法を見つけたと思う:
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ですが)、現在のニーズに合っています。