我有一张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个基因。我真的不知道怎么做这样的比较......答案 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)