1

ほぼ必要なことを実行するSQLステートメントがあります。私が必要としているのは、両方のqseqid値に対してpindent>60およびcoverage> 60となる属を見つけることです。たぶんこの質問のように、私はある種の参加が必要だと思います

これが私が今持っているものです。これは私が望む結果を達成しません。

SELECT qseqid, genus, species, txid, sgi, pindent, coverage 
FROM vmdavis.insecta10000
WHERE pindent > 60
AND coverage > 60
AND qseqid in ("diaci0.9_transcript_99990000013040", "diaci0.9_transcript_99990000022677")
ORDER BY  genus, species, qseqid, coverage, pindent;

これが機能しない理由の例を次に示します。Anchonは、dia ... 040のqseqidについて上記の基準を満たしていますが、dia ... 677については満たしていないため、この行はわかりません。

| diaci0.9_transcript_99990000013040 | Anchon           | sp. NYSM 95-02-01-35          |  265052 |   6467730 |   80.93 |  61.7597 |

これが表のサンプルです

mysql> SELECT qseqid, genus, species, txid, pindent, coverage FROM vmdavis.insecta10000 limit 5;
+------------------------------------+---------+-------------+--------+---------+----------+
| qseqid                             | genus   | species     | txid   | pindent | coverage |
+------------------------------------+---------+-------------+--------+---------+----------+
| diaci0.9_transcript_99990000000055 | Apis    | florea      |   7463 |    97.5 |  2.58107 |
| diaci0.9_transcript_99990000000055 | Bombus  | impatiens   | 132113 |    97.5 |   3.3534 |
| diaci0.9_transcript_99990000000055 | Nasonia | vitripennis |   7425 |    97.5 |  1.58343 |
| diaci0.9_transcript_99990000000055 | Bombus  | terrestris  |  30195 |    97.5 |  3.41207 |
| diaci0.9_transcript_99990000000055 | Apis    | mellifera   |   7460 |    97.5 |  2.88889 |
+------------------------------------+---------+-------------+--------+---------+----------+

これが例です。この場合、Agetocera属は2回リストされています。これは、両方のqseqidについて、ピンデントとカバレッジの基準を満たしているためです。Agetoceraが両方のqseqidでpindent>60およびcoverage>60の条件を満たさなかった場合は、これらの行のいずれかをリストする必要があります。

| qseqid                             | genus     | species     | txid   | pindent | coverage
| diaci0.9_transcript_99990000013040 | Agetocera | mirablis    |  715820 | 291191497 |   82.37 |  60.7963 |
| diaci0.9_transcript_99990000022677 | Agetocera | mirablis    |  909986 | 309755769 |   77.52 |  78.6269 |

私はmysqlに非常に慣れていないので、この質問に対する答えはおそらくstackoverflowにあると思います。解決策を見つけたら、何を検索したり理解したりするのかわかりません。質問がより適切であるか、より適切なタイトルを提案できる場合は、更新します。

4

2 に答える 2

1

次のようなものを試してください-サブクエリを使用して、目的の属のみを取得します。

SELECT *
FROM insecta10000 i 
  JOIN 
  (
  SELECT genus
  FROM insecta10000
  WHERE pindent > 60
    AND coverage > 60
    AND qseqid in ("diaci0.9_transcript_99990000013040", "diaci0.9_transcript_99990000022677")
  GROUP BY genus
  HAVING COUNT(*) = 2
  ) i2 on i.genus = i2.genus 

そして、これがSQLFiddleです。

幸運を。

于 2013-02-04T06:24:35.877 に答える
0

Coverage> 60、pindent> 60の両方を満たすレコードが必要な場合は、すでにクエリを取得しています。unionただし、このようなもの、つまりカバレッジとピンデントを別々に満たすレコードを探している場合は、次のことを試してください。

SELECT * FROM (
SELECT qseqid, genus, species, txid, sgi, pindent, coverage 
FROM vmdavis.insecta10000
WHERE pindent > 60    
UNION
SELECT qseqid, genus, species, txid, sgi, pindent, coverage 
FROM vmdavis.insecta10000
WHERE coverage > 60) x
WHERE x.qseqid in ("diaci0.9_transcript_99990000013040", "diaci0.9_transcript_99990000022677")
ORDER BY  x.genus, x.species, x.qseqid, x.coverage, x.pindent
;

これで、期待される出力が得られました:(列は異なりますが..わずかにsig):

http://sqlfiddle.com/#!2/f89ce/4

SELECT qseqid, genus, species, txid, 
indent, coverage 
FROM demo
WHERE indent > 60
AND coverage > 60
AND qseqid in ("diaci0.9_transcript_99990000013040", "diaci0.9_transcript_99990000022677")
ORDER BY  genus, species, qseqid, coverage, indent;

|                             QSEQID |     GENUS |  SPECIES |   TXID | INDENT | COVERAGE |
------------------------------------------------------------------------------------------
| diaci0.9_transcript_99990000013040 | Agetocera | mirablis | 715820 |  82.37 |  60.7963 |
| diaci0.9_transcript_99990000022677 | Agetocera | mirablis | 909986 |  77.52 |  78.6269 |
于 2013-02-04T05:46:04.640 に答える