Php DB:多列之间的匹配和评分(3D数据集)
我的一位熟人询问了一个独特的SQL任务。他们是生物技术研究人员,因此不熟悉SQL。他们使用Excel进行操作,这限制了他们进行分析的能力,并要求我提供帮助。对于选择这种解决方案的方法,我同样感到困惑,即编程方法或DB查询应该就足够了。如果是DB查询,那么它应该是什么?考虑代码行数和CPU周期/RAM消耗,因为这是大型系统的一小部分 问题集是关于不同样本之间的匹配。每个示例都有PrimaryKey:MemberID。每个MemberID有6个参数分数。每个参数都是唯一的,因此参数之间不允许交叉匹配。如果参数与其他样本匹配,则得分为1。最大分数为6,最小分数为0。示例集如下: 原始输入是唯一的数据集。我已经可视化了结果集 以下是条件: 特定分数只能与该特定分数匹配。i、 e分数1只能与其他分数1匹配 一个查找查询,显示特定MemberID的匹配项,该查询显示MemberID 6/6、6/5等的匹配项 显示表的统计信息的常规查询,共有6/6个匹配项、6/5个匹配项等 用于显示特定匹配项6/6、6/5或6/4等的查询。 我考虑将数据结构转换为如下内容:Php DB:多列之间的匹配和评分(3D数据集),php,mysql,sql,multidimensional-array,Php,Mysql,Sql,Multidimensional Array,我的一位熟人询问了一个独特的SQL任务。他们是生物技术研究人员,因此不熟悉SQL。他们使用Excel进行操作,这限制了他们进行分析的能力,并要求我提供帮助。对于选择这种解决方案的方法,我同样感到困惑,即编程方法或DB查询应该就足够了。如果是DB查询,那么它应该是什么?考虑代码行数和CPU周期/RAM消耗,因为这是大型系统的一小部分 问题集是关于不同样本之间的匹配。每个示例都有PrimaryKey:MemberID。每个MemberID有6个参数分数。每个参数都是唯一的,因此参数之间不允许交叉匹配
然后使用groupby生成结果集。但是这个3D装置正在融合我的大脑。用于此MySQL和PHP的技术。对上面指定的结果集有任何帮助吗?对于每个成员,您需要与其他成员匹配的分数数。首先,我想说:
select s.memberid, s2.memberid,
( (s1.score1 = s2.score1) + (s1.score2 = s2.score2) + (s1.score3 = s2.score3) +
(s1.score4 = s2.score4) + (s.score5 = s2.score5) + (s1.score6 = s2.score6)
) as scores_in_common
from sample s join
sample s2
on s.memberid <> s2.memberid;
这对于你正在做的事情来说已经足够了。信息位于结果集中,但格式不同
对于您的特定格式:
select memberid,
group_concat(case when scores_in_common = 6 then memberid2 end) as in_common_6,
group_concat(case when scores_in_common = 5 then memberid2 end) as in_common_5,
group_concat(case when scores_in_common = 4 then memberid2 end) as in_common_4,
group_concat(case when scores_in_common = 3 then memberid2 end) as in_common_3,
group_concat(case when scores_in_common = 2 then memberid2 end) as in_common_2,
group_concat(case when scores_in_common = 1 then memberid2 end) as in_common_1
from (select s.memberid, s2.memberid as memberid2,
( (s1.score1 = s2.score1) + (s1.score2 = s2.score2) + (s1.score3 = s2.score3) +
(s1.score4 = s2.score4) + (s.score5 = s2.score5) + (s1.score6 = s2.score6)
) as scores_in_common
from sample s join
sample s2
on s.memberid <> s2.memberid
) ss
where scores_in_common >= 1
group by memberid;
我猜第一种格式和第一个查询在CPU上更便宜,但在RAM上更难。也许我不知道我在说什么。。。但解决方案是完美的!非常感谢。