【发布时间】:2014-08-26 02:17:45
【问题描述】:
我有两个表突变和参考如下:
## Mutation
mysql> select * from mutation limit 10;
+------+------+------+------+-----------+
| pos | ref | alt | name | alt_codon |
+------+------+------+------+-----------+
| 6 | C | T | ND1 | NULL |
| 10 | T | C | ND1 | NULL |
| 2799 | A | G | ND1 | NULL |
| 2808 | C | T | ND1 | NULL |
| 2825 | T | C | ND1 | NULL |
| 2847 | A | G | ND1 | NULL |
## Reference
mysql> select * from reference limit 10;
+------+------+------+----------+------+------+------+
| pos1 | pos2 | pos3 | codon | c1 | c2 | c3 |
+------+------+------+----------+------+------+------+
| 1 | 2 | 3 | TTC | T | T | C |
| 4 | 5 | 6 | GTC | G | T | C |
对于表突变中的每一行,如果列 pos 与表引用中的 pos1 或 pos2 或 pos3 匹配,则应按如下方式更新表突变中的列 alt_codon:
- 如果 mutation.pos = reference.pos1 THEN C1 被 ALT 替换,得到 alt_codon = ALT + C2 + C3
- 如果 mutation.pos = reference.pos2 THEN C2 被 ALT 替换,得到 alt_codon = C1 + ALT + C3
- 如果 mutation.pos = reference.pos3 THEN C1 被 ALT 替换,得到 alt_codon = C1 + C2 + ALT
例如在mutation的第一行,pos = 2786,等于pos3,在reference中的第3个,到alt_codon应该是c1 + c2 + alt = GTT
我想我应该使用带别名的 UNION 语句,但我想不出办法,并写了一段不起作用的查询:
UPDATE mutation CROSS JOIN reference ON
(mutation.pos = reference.pos1 OR mutation.pos = reference.po2 OR mutation.pos = reference.pos3)
SET mutation.alt_codon =
CASE WHEN mutation.pos = reference.pos1 THEN (SELECT CONCAT(mutation.alt, reference.c2, reference.c3))
WHEN mutation.pos = reference.pos2 THEN (SELECT CONCAT(reference.c1, mutation.alt, reference.c3))
WHEN mutation.pos = reference.pos3 THEN (SELECT CONCAT(reference.c1, reference.c2, mutation.alt))
ELSE mutation.alt_codon END;
任何帮助或建议将不胜感激:)
【问题讨论】: