我不知道如何编写SQL查询。

给定数据:
几个特征标识符整数-假设1和447。

我正在寻找domain_ids,我将在其中找到分配给特定特征的snp。当SNP的genomic_pos在域startend之间且chr_id相同时,SNP在该域中。共有两种情况:


在所有情况下,我都在寻找可以从所有给定特征中找到snps的域。换句话说,所有特征在域中都有其snp代表。
无论如何,我都在寻找可以从任何给定域中找到snps的域。换句话说,仅找到域中任何特征的一个snp代表就足够了。


我已经解决了所有情况,但我坚持所有情况:(

这是任何代码:

SELECT DISTINCT domains.domain_id
FROM snps JOIN traits_snps ON snps.snp_id     = traits_snps.snp_id
       JOIN traits      ON traits.trait_id = traits_snps.trait_id
       JOIN chromosomes ON snps.chr_id     = chromosomes.chr_id
       JOIN domains     ON domains.chr_id  = chromosomes.chr_id
WHERE traits.trait_id in (447,1 )   --  <-- HERE GOES TRAIT IDS
   AND genomic_pos BETWEEN start AND end
   AND domains.chr_id = snps.chr_id;


这是我在SQLite中的数据库。 sql - 困难的SQL查询所有和任何情况-LMLPHP

最佳答案

如果我理解正确,您可以使用group byhaving做您想做的事情:

SELECT d.domain_id
FROM snps s JOIN
     traits_snps ts
     ON s.snp_id = ts.snp_id JOIN
     traits t
     ON t.trait_id = ts.trait_id JOIN
     chromosomes c
     ON s.chr_id  = c.chr_id JOIN
     domains d
     ON d.chr_id = c.chr_id AND
        d.chr_id = s.chr_id  -- JOIN conditions should be in ON clauses
WHERE t.trait_id in (447, 1) AND --  <-- HERE GOES TRAIT IDS
      genomic_pos BETWEEN start AND end
GROUP BY d.domain_id
HAVING COUNT(DISTINCT t.trait_id) = 2;

10-05 22:05