Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php DB:多列之间的匹配和评分(3D数据集)_Php_Mysql_Sql_Multidimensional Array - Fatal编程技术网

Php DB:多列之间的匹配和评分(3D数据集)

Php DB:多列之间的匹配和评分(3D数据集),php,mysql,sql,multidimensional-array,Php,Mysql,Sql,Multidimensional Array,我的一位熟人询问了一个独特的SQL任务。他们是生物技术研究人员,因此不熟悉SQL。他们使用Excel进行操作,这限制了他们进行分析的能力,并要求我提供帮助。对于选择这种解决方案的方法,我同样感到困惑,即编程方法或DB查询应该就足够了。如果是DB查询,那么它应该是什么?考虑代码行数和CPU周期/RAM消耗,因为这是大型系统的一小部分 问题集是关于不同样本之间的匹配。每个示例都有PrimaryKey:MemberID。每个MemberID有6个参数分数。每个参数都是唯一的,因此参数之间不允许交叉匹配

我的一位熟人询问了一个独特的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等的查询。 我考虑将数据结构转换为如下内容:


然后使用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上更难。也许我不知道我在说什么。。。但解决方案是完美的!非常感谢。