我有一个子表,其中包含一些特定'材料的特征/值对。 (MaterialID)。任何材料都可以有多个charact值,并且可能有几个相同的名称(参见id' s 2,3)。
该表有大量记录(800多万)。我想要做的是找到与提供的材料最相似的材料。也就是说,当我提供MaterialID时,我想要一个最相似的其他材料(具有最匹配的charact / value对的那些)的有序列表。
我做过一些研究但是,我可能会遗漏一些关键术语,或者只是没有正确地概念化问题。
非常感谢任何关于如何解决这个问题的提示。
ID MaterialID Charact Value
1 1 ROT_DIR CCW
2 1 SPECIAL_FEATURE CATALOG_CP
3 1 SPECIAL_FEATURE CHROME
4 1 SCHEDULE 80
5 2 BEARING_TYPE SB
6 2 SCHEDULE 80
7 3 ROT_DIR CCW
8 3 SPECIAL_FEATURE CATALOG_HSB
9 3 BEARING_TYPE SP
10 4 NDE_STYLE W_FAN
11 4 BEARING_TYPE SB
12 4 ROT_DIR CW*
答案 0 :(得分:2)
您可以使用自我加入来执行此操作:
orWhere
注意:
$results = EvidenceFile::whereNotIn('id', $exclude_file_ids)
->where(function ($query) use ($user_id) {
$query->where('owner_id', $user_id)
->orWhere('public', '1');
})
->get();
添加到select t.materialid, count(*) as nummatches
from t join
t tmat
on t.Charact = tmat.Charact and t.value = tmat.value
where tmat.materialid = @MaterialId
group by t.materialid
order by nummatches desc;
子句来删除指定的材料。where t.MaterialId <> tmat.MaterialId
并将where
条件移至left join
子句。where
。