MYSQL在同一个表中选择

MYSQL在同一个表中选择,mysql,select,Mysql,Select,我有一个SQL语句,它几乎实现了我想要的功能。我需要的是找到这样的 对于两个qseqid值,凹痕>60,覆盖率>60。我想我需要某种类型的加入,也许像这样 这是我现在拥有的。这并没有达到我想要的结果 SELECT qseqid, genus, species, txid, sgi, pindent, coverage FROM vmdavis.insecta10000 WHERE pindent > 60 AND coverage > 60 AND qseqid in ("diac

我有一个SQL语句,它几乎实现了我想要的功能。我需要的是找到这样的 对于两个qseqid值,凹痕>60,覆盖率>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符合上述关于直径为040的qseqid标准,但不符合直径为677的qseqid标准,因此我不想解释这一行

| 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属被列出两次,因为对于这两个qseqid,它都符合品级和覆盖率的标准。如果Agetocera不符合两个qseqid的pindent>60和覆盖率>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上。如果我找到了,我就不知道该搜索什么,也不知道该理解什么样的解决方案。如果这个问题可以问得更好,或者你可以建议一个更好的标题,我会更新。

如果你想要的记录同时满足覆盖率>60,pindent>60,那么你已经得到了查询。但是,如果您正在查看这样的内容,即分别满足Coverage和pindent要求的记录的联合,请尝试以下方法:

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:


如果您想要同时满足Coverage>60和pindent>60的记录,那么您已经得到了查询。但是,如果您正在查看这样的内容,即分别满足Coverage和pindent要求的记录的联合,请尝试以下方法:

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:


尝试以下操作-使用子查询仅获取所需的属:

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 
这是我的答案


祝你好运。

试试这样的方法-使用子查询仅获取所需的类别:

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 
这是我的答案



祝你好运。

你能提供你的桌子结构吗?同时提供一些样本数据和您的预期结果当您说需要查找属时,您的意思是只选择不同的属吗?您遇到了什么问题?@sgedes我只需要数据库中的行,因为两个qseqid值都满足了pindent和coverage标准。我仍然需要genus和qseqid的行,因此我不知道如何对输出进行分组。您所有的pindent和coverage值都遵循您的标准,即您的select执行您希望它执行的操作。您希望上面示例中的输出是什么?我认为您当前的实现没有问题。您能提供表结构吗?同时提供一些样本数据和您的预期结果当您说需要查找属时,您的意思是只选择不同的属吗?您遇到了什么问题?@sgedes我只需要数据库中的行,因为两个qseqid值都满足了pindent和coverage标准。我仍然需要genus和qseqid的行,因此我不知道如何对输出进行分组。您所有的pindent和coverage值都遵循您的标准,即您的select执行您希望它执行的操作。您希望上面示例中的输出是什么?我不认为你目前的实施有什么问题。为什么联盟是必要的?你就不能用这个吗?仍然对OP请求感到困惑。@sgedes我曾想过使用OR,但似乎那不是他想要的。。Coz或将涵盖同时满足两个条件或一个条件的记录。看看他的问题,他已经找到了解决这两个问题的方法。所以左可能性大的假设可能是工会单独获取记录。。不过很奇怪。@bonCodigo也许我想要一个联盟,但不是在pindent和coverage上,而是在qseqid上。我会考虑一下。好的,我试过下面这个,不是我想要的,不清楚它和我现在的有什么不同。从vmdavis.INSETA1000中选择qseqid、属、种、txid、sgi、pindent、覆盖率,其中pindent>60且覆盖率>60,qseqid=diaci0.9_转录本_9990000013040联合选择qseqid、属、种、txid、sgi、pindent,vmdavis.Inseta10000的覆盖率,其中pindent>60和覆盖率>60,qseqid=diaci0.9_转录本_99000022677,按属、种、qseqid、覆盖率、pindent排序;坦率地说,看看您的预期输出,似乎没有问题,请检查这里。那可能是你们有两种不同的锉刀和压痕吗?为什么有必要合并呢?你就不能用这个吗?仍然对OP请求感到困惑。@sgedes我曾想过使用OR,但似乎那不是他想要的。。Coz或将涵盖同时满足两个条件或一个条件的记录。看看他的问题,他已经找到了解决这两个问题的方法。所以左可能性大的假设可能是工会单独获取记录。。不过很奇怪。@bonCodigo也许我想要一个联盟,但不是在pindent和coverage上,而是在qseqid上。我会考虑一下。好的,我试过下面这个,不是我想要的,不清楚它和我现在的有什么不同。选择qseqid、属、种、txid、sgi、pindent、vmdavis的覆盖率