【问题标题】:compare the result of two selects on same table比较同一张表上两次选择的结果
【发布时间】:2019-06-21 04:45:41
【问题描述】:

假设我有一个表,mytable,如下:

sampleID   rs         A1    A2
--------------------------------
1001       rs123      A     C
1001       rs124      T     C
1001       rs125      A     T
1001       rs126      A     C
1002       rs122      A     C
1002       rs123      T     C
1002       rs124      T     C
1002       rs125      A     C

我想比较任何两个具有共同 rs 值的 sampleID,看看它们的 A1 和/或 A2 值是否匹配。

举个例子

SELECT sampleID as Sample1, rs as rs1, A1 as A1_1, A2 as A2_1 FROM mytable where sampleID = "1001"  

SELECT sampleID as Sample2, rs as rs2, A1 as A1_2, A2 as A2_2 FROM mytable where sampleID = "1002" 

如何编写一个 SELECT 语句,获取上述每个 SELECT 的结果,在 rs1 = rs2 处连接,并将 A1_1 与 A1_2 以及 A2_1 与 A2_2 进行比较?

【问题讨论】:

  • 你自己说的有问题。尝试加入same table alias. select t1.samleid as samp1,t2.sampleid as samp2,.....from mytable t1 join mytable t2 on t1. rs = t2.rs2 where ....

标签: mysql select subquery


【解决方案1】:

我会在这里用作自连接来处理比较:

SELECT
    t1.sampleID,
    t2.sampleID,
    t1.rs,
    t1.A1,
    t2.A1,
    (t1.A1 = t2.A1) AS A1_comp,
    t1.A2,
    t2.A2,
    (t1.A2 = t2.A2) AS A2_comp
FROM mytable t1
INNER JOIN mytable t2
    ON t1.sampleID < t2.sampleID
WHERE
    t1.rs = t2.rs
ORDER BY
    t1.sampleID,
    t2.sampleID,
    t1.rs;

Demo

联接条件要求联接左侧的sampleID 严格小于 右侧。这确保我们不会重复比较,或将同一样本与其自身进行比较。我们利用 MySQL 语法允许的为 A1A2 值选择布尔等式。别名 A1_compA1_comp 将是 0 表示不匹配,1 表示匹配。

【讨论】:

    【解决方案2】:

    为了完整起见,我想包含之前发布的答案的略微修改版本。在此版本中,根据 WHERE 子句仅显示不匹配的 A1/A2 列

    SELECT 
    A.rs1 as rs, A.Sample1_A1, A.Sample1_A2, B.Sample2_A1, B.Sample2_A2  
        from
        (
        SELECT sampleID as Sample1, rs as rs1, A1 as Sample1_A1, A2 as Sample1_A2 
        FROM mytable where sampleID = "1001" 
        )A left join
        ( 
        SELECT sampleID as Sample2, rs as rs2, A1 as Sample2_A1, A2 as Sample2_A2 
        FROM mytable where sampleID = "1002" 
        )B on A.rs1=B.rs2
    
    where A.Sample1_A1 != B.Sample2_A1 or A.Sample1_A2 != B.Sample2_A2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2018-09-24
      • 1970-01-01
      • 2013-08-27
      • 2019-11-23
      • 1970-01-01
      相关资源
      最近更新 更多