列出在常见MySQL中具有最多值的前10个项目对

时间:2015-02-18 01:26:35

标签: mysql

我有一张miRNA和DNA(基因)表。每个miRNA调节许多不同的基因。我们的目标是列出最常见的基因调控的前10种miRNAS。

我正在使用的表有89,043行,看起来像这样:

mid   gid
-----------
1     1       
1     297     
1     305     
1     394     
1     450     
2     1       
2     2       
2     61      
2     72      
3     1       
3     12      
3     61      
3     450     

mid代表miRNA; gid是Gene。正如您所见,每个miRNA都可以调节多个基因。有1498个miRNA调节~30-40个基因。目标是创建一组受每个miRNA调控的基因,然后以某种方式查看每个集合与其他集合共享的值,计算共享值,按计数排序共享数据,并选择前10个。我不知道怎么做MySQL中的集合和比较...甚至不确定你是否可以;看起来更像是Python的工作......

任何帮助将不胜感激!

编辑:我需要找到具有最多基因调控的miRNA的前10个。例如,miRNA#17和#42各自调节30个相同的基因,而不仅仅是30个基因。我真的不知道怎么做这样的比较......

2 个答案:

答案 0 :(得分:1)

查找前十个miRNA项目是一个简单的聚合查询。

SELECT COUNT(*) genes_regulated,
       mid
  FROM the_table
 GROUP BY mid
 ORDER BY COUNT(*) DESC
 LIMIT 10

编辑但您正在寻找能够共同调控基因的miRNA对。

所以,让我们解决它吧。 JOIN的组合能力在这里有很大帮助。此查询将提供具有相同mid的{​​{1}}项对的列表。 (http://sqlfiddle.com/#!2/2279bb/3/0

gid

此查询为每对引用同一gid的mid提供一行。请注意, SELECT a.mid amid, b.mid bmid, a.gid FROM t a JOIN t b ON a.gid = b.gid AND a.mid < b.mid 子句既匹配表之间的gid,也阻止自匹配(其中a.mid = b.mid)和重复对,即(q,r)和(r,q)。 / p>

接下来,我们需要总结虚拟表 - 子查询 - 对。这是一个简单的ON聚合查询。 (http://sqlfiddle.com/#!2/2279bb/4/0

COUNT() ... GROUP BY

编辑如果您希望miRNA对的身份按照基因数量的顺序排列,而不是通过调节它们的miRNA对按顺序排列基因,那么这对查询来说是一个微不足道的变化。 (http://sqlfiddle.com/#!2/2279bb/5/0

SELECT COUNT(*) mid_pair_count, gid
  FROM (
          SELECT a.mid amid, b.mid bmid, a.gid
            FROM t a
            JOIN t b ON a.gid = b.gid AND a.mid < b.mid
        ) pairs
 GROUP BY gid
 ORDER BY COUNT(*) DESC
 LIMIT 10

最后(以及结构化查询语言中的结构化开始真正启动的地方,您可以获得每个基因受哪些基因调控的列表使用SELECT COUNT(*) gene_count, amid, bmid FROM ( SELECT a.mid amid, b.mid bmid, a.gid FROM t a JOIN t b ON a.gid = b.gid AND a.mid < b.mid ) pairs GROUP BY amid, bmid ORDER BY COUNT(*) DESC LIMIT 10 。(http://sqlfiddle.com/#!2/2279bb/7/0

配对前十名
GROUP_CONCAT()

重点在于:SQL的核心是集处理工具。您可以使用SQL SELECT COUNT(*) gene_count, GROUP_CONCAT(gid ORDER BY gid) gene_list, amid, bmid FROM ( SELECT a.mid amid, b.mid bmid, a.gid FROM t a JOIN t b ON a.gid = b.gid AND a.mid < b.mid ) pairs GROUP BY amid, bmid ORDER BY COUNT(*) DESC LIMIT 10 执行组合爆炸。您可以通过JOIN上的明智使用来限制组合爆炸。最后,您可以按JOIN ... ON汇总组合。将表格与自身联系起来是探索巧合和组合的有效方式。

答案 1 :(得分:0)

试试这个

 select mid,count(gid) from TABLE group by mid ORDER BY count(gid)