【问题标题】:DB: Matchmaking and Scoring between multiple columns (3D Data Set)DB:多列之间的匹配和评分(3D 数据集)
【发布时间】:2019-03-10 03:31:40
【问题描述】:

我的一个熟人询问了一个独特的 SQL 任务。他们是生物技术研究人员,因此不精通 SQL。他们在 Excel 中运行,这限制了他们进行分析的能力,并要求我提供帮助。对于为该解决方案选择方法,我同样感到困惑,即编程方法或数据库查询就足够了。如果,数据库查询,那么它应该是什么?从代码行和 CPU 周期/RAM 消耗的角度考虑这一点,因为这是一个大系统的一小部分。

问题集是关于不同样本之间的匹配。每个样本都有 PrimaryKey : MemberID。每个 MemberID 有 6 个参数分数。每个参数都是唯一的,因此不允许参数之间的交叉匹配。如果参数与其他样本匹配,则得分为 1。最大得分为 6,最小得分为 0。示例集如下:

原始输入是唯一的数据集。我已经将结果集可视化了。

条件如下:

  • 特定分数只能与该特定分数匹配。 (即 Score1 只能与其他 Score1 匹配)
  • 查找查询显示特定 MemberID 的匹配项,其中显示匹配项 (MemberIDs)(6/6、6/5 等)
  • 显示表统计信息的通用查询(总共 6/6 匹配、6/5 匹配等)
  • 显示特定匹配(6/6、6/5 或 6/4)等的查询。

我考虑过将数据结构转换为:

然后使用groupby生成结果集。但是这个 3D 集正在融合我的大脑。用于此 MySQL 和 PHP 的技术。对上面指定的结果集有任何帮助吗?

【问题讨论】:

    标签: php mysql sql multidimensional-array


    【解决方案1】:

    对于每个成员,您需要与其他成员匹配的分数数。我会开始:

    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 上有点困难。也许我不知道我在说什么......但解决方案是完美的!谢谢!
    猜你喜欢
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    相关资源
    最近更新 更多