MySQL,将一个表的两个子集连接在一起

时间:2012-02-13 01:41:39

标签: mysql sql

我的查询构建存在问题......

我有一个表,其中包含行:name,start,end,ref,alt,patientNo。 示例数据如下所示:

chr1, 10, 10, A, B, 9999;
chr1, 12, 12, B, A, 9999;
chr1, 18, 18, A, B, 9999;
chr1, 29, 29, C, B, 9999;
chr1, 10, 10, A, A, 8888;
chr1, 12, 12, A, B, 8888;
chr2, 18, 18, D, C, 8888;
chr2, 29, 29, A, B, 8888;

结束......

我需要构建一个查询,比较彼此之间的患者。 即: if(患者9999的chr1,start,end,alt)=(患者8888的chr1,start,end,alt) 回来......

任何想法如何建立这样的查询? 感谢

编辑:

好的,我还有问题。 我有10个CSV文件,其中包含患者的基因组数据。 每个文件包含大约70000行。 我将CSV文件中的数据放入MySQL数据库(因此我的数据库包含一个包含700000行的表)。

现在我需要过滤这些数据。有很多列,例如: 名称(varchar),开始(int),结束(int),参考(varchar), alt (varchar), patientNo (varchar)。 一个示例声明:SELECT name, start, end, ref, alt, patientNo FROM mytable;返回以下数据:

chr1, 10, 10, A, C, 9999;
chr1, 12, 12, T, T, 9999;
chr2, 18, 18, A, T, 9999;
chr2, 29, 29, C, C, 9999;
chr3, 10, 10, A, G, 9999;
chr3, 12, 12, A, C, 9999;
chr1, 18, 18, G, C, 8888;
chr2, 29, 29, A, G, 8888;
chr2, 10, 10, A, G, 8888;
chr3, 12, 12, G, A, 8888;
chr1, 18, 18, A, G, 666z;
chr2, 29, 29, C, G, 666z;
chr3, 10, 10, A, A, 666z;
chr4, 12, 12, A, G, 666z;
chr5, 18, 18, T, C, 666z;
chr1, 29, 29, A, G, 44a4;
chr1, 10, 10, A, G, 44a4;
chr2, 12, 12, G, A, 44a4;
chr2, 18, 18, A, G, 44a4;
chr1, 29, 29, C, G, 3333;
chr1, 10, 10, A, A, 3333;
chr1, 12, 12, A, G, 3333;
chr1, 18, 18, T, C, 3333;
chr2, 29, 29, A, G, 3333;

我需要在 alt 列中提取具有唯一字母的行,在名称开始位置, alt 信,这对患者来说是独一无二的。 如果我加入专栏

SELECT p1.name, p1.start, p1.alt, p2.alt, p3.alt, p4.alt, p5.alt 
FROM mytable p1, mytable p2, mytable p3, mytable p4, mytable p5 
WHERE ( p1.patientNo = "9999" and p2.patientNo = "8888" and 
        p3.patientNo = "666z" and p4.patientNo = "44a4" and
        p5.patientNo = "3333") ;

我考虑结果,例如:

chr1 10 A A A A A
chr1 13 G G G G G
chr2 17 A A G A A
chr2 19 A A G G A
chr3 38 A C A T T 

这意味着:

  • 在位置start = 10时,每个患者p1,p2,p3,p4,p5都有一个A字母。我们跳过这一行很好
  • 与start posiotion 13相同。
  • 在位置start = 17,患者p3有唯一字母G,所以我们 将此行放入结果表
  • 在下一行(19)中没有唯一的字母,我们跳过它。
  • 在行(38)中,“C”是一个唯一的字母,因此我们将患者p2放入 结果表。

最后,上面示例的结果应如下所示:

chr2, 17, G, 666z
chr3, 19, C, 8888 

是否可以构造一个查询,从原始表中返回这样的结果?

2 个答案:

答案 0 :(得分:0)

SELECT a.name, a.start, a.end, a.alt, a.patientNo,
    b.name, b.start, b.end, b.alt, b.patientNo
FROM patient AS a, patient AS b
WHERE a.name = b.name
AND a.start = b.start
AND a.end = b.end
AND a.alt = b.alt
AND a.patientNo < b.patientNo
ORDER by a.name

使用以下表格:

SELECT <Columns> FROM <Table(s)> WHERE <Condition> ORDER BY <Columns>

答案 1 :(得分:0)

没试过,但请看:

SELECT p1.*, p2.* FROM tablePatients p1, tablePatients p2 WHERE p1.chr1 = p2.chr1  AND p1.start = p1.start AND p1.end = p2.end AND p1.ref = p2.ref AND p1.alt = p2.alt