检索后使用查询的长度和位置值与编程语言子字符串的MySQL子字符串

检索后使用查询的长度和位置值与编程语言子字符串的MySQL子字符串,mysql,substring,multiple-select-query,Mysql,Substring,Multiple Select Query,我正在访问chado结构化的mysql数据库。我通过基因产物进行搜索,本例中的产物为“双功能GDP-岩藻糖合成酶:GDP-4-脱氢-6-脱氧-D-甘露糖差异构酶和GDP-4-脱氢-6-L-脱氧半乳糖还原酶” 然后,我可以使用JOIN语句来查找这个基因所在的程序集及其坐标。下面的SQL语句有效,将返回程序集的序列(不仅仅是基因序列),以及程序集上感兴趣的基因的开始和停止位置 SELECT f.uniquename AS protein_accession, product.value AS pro

我正在访问chado结构化的mysql数据库。我通过基因产物进行搜索,本例中的产物为“双功能GDP-岩藻糖合成酶:GDP-4-脱氢-6-脱氧-D-甘露糖差异构酶和GDP-4-脱氢-6-L-脱氧半乳糖还原酶”

然后,我可以使用JOIN语句来查找这个基因所在的程序集及其坐标。下面的SQL语句有效,将返回程序集的序列(不仅仅是基因序列),以及程序集上感兴趣的基因的开始和停止位置

SELECT f.uniquename AS protein_accession, product.value AS protein_name, srcfeature.residues AS residue_sequence, srcassembly.name AS source_type, location.fmin AS location_min, location.fmax AS location_max, location.strand
FROM feature f
JOIN cvterm polypeptide ON f.type_id=polypeptide.cvterm_id
JOIN featureprop product ON f.feature_id=product.feature_id
JOIN cvterm productprop ON product.type_id=productprop.cvterm_id
JOIN featureloc location ON f.feature_id=location.feature_id
JOIN feature srcfeature ON location.srcfeature_id=srcfeature.feature_id
JOIN cvterm srcassembly ON srcfeature.type_id=srcassembly.cvterm_id
WHERE polypeptide.name = 'polypeptide'
AND productprop.name = 'gene_product_name'
AND product.value LIKE '%bifunctional GDP-fucose synthetase: GDP-4-dehydro-6-deoxy-D-mannose epimerase and GDP-4-dehydro-6-L-deoxygalactose reductase%';
装配顺序非常长,我绝对不需要全部。使用MySQL的子字符串方法提取我需要的部分以保存检索整个序列,还是在检索后使用编程语言的子字符串方法更好?下面的查询是我使用在查询位置和长度期间获得的值尝试使用SUBSTRING方法。它不工作,我猜它需要多个SELECT语句才能工作。SQL变得非常糟糕,我甚至不确定最终的工作结果是否会更好

您的想法是什么,使用SQL子字符串更好,还是使用编程语言和子字符串方法来显示我想要的内容,即使我已经检索了整个内容?

SELECT f.uniquename AS protein_accession, product.value AS protein_name, SUBSTRING(srcfeature.residues AS residue_sequence, location_min, location_max - location_min), srcassembly.name AS source_type, location.fmin AS location_min, location.fmax AS location_max, location.strand
FROM feature f
JOIN cvterm polypeptide ON f.type_id=polypeptide.cvterm_id
JOIN featureprop product ON f.feature_id=product.feature_id
JOIN cvterm productprop ON product.type_id=productprop.cvterm_id
JOIN featureloc location ON f.feature_id=location.feature_id
JOIN feature srcfeature ON location.srcfeature_id=srcfeature.feature_id
JOIN cvterm srcassembly ON srcfeature.type_id=srcassembly.cvterm_id
WHERE polypeptide.name = 'polypeptide'
AND productprop.name = 'gene_product_name'
AND product.value LIKE '%bifunctional GDP-fucose synthetase: GDP-4-dehydro-6-deoxy-D-mannose epimerase and GDP-4-dehydro-6-L-deoxygalactose reductase%';
编辑 下面是一个不同基因(简称)的示例结果。我省略了查询序列上的部分,因为该部分有数千个字符长。我必须使用此处显示的location_min和location_max的值来正确地生成子字符串

+-------------------+---------------------------------------------------+-------------+--------------+--------------+--------+
| protein_accession | protein_name                                      | source_type | location_min | location_max | strand |
+-------------------+---------------------------------------------------+-------------+--------------+--------------+--------+
| ECDH10B_0026      | bifunctional riboflavin kinase and FAD synthetase | assembly    |        21406 |        22348 |      1 |
+-------------------+---------------------------------------------------+-------------+--------------+--------------+--------+

如果这样做对你有用:

SELECT f.uniquename AS protein_accession, 
       product.value AS protein_name, 
       SUBSTRING(
                   srcfeature.residues, 
                   patindex('%SOMPATTERN%',srcfeature.residues), 
                   LEN(srcfeature.residues) - patindex('%SOMPATTERN%',srcfeature.residues)
                ) AS residue_sequence, 
      srcassembly.name AS source_type, 

然后在SQL中尝试。如果没有,请使用应用程序编程语言。

您的
,因为
位于错误的位置。它需要在
子字符串()的结束参数之后执行:


至于您的另一个问题,我认为提取查询中所需的数据比将不必要的数据传回应用程序更有意义。这节省了通信开销。另外,如果数据库使用多个线程/处理器,那么它有机会并行运行。

这种更改是有意义的。不幸的是,查询仍然不起作用。我认为,因为location_min和location_max是从该查询生成的值。这就是为什么我认为它可能需要多个SELECT语句。一个用于获取location_min和location_max的值,然后一个用于将它们作为子字符串srcfeature.residuals。如果我像上面那样使用该查询,MySQL会给我一个错误:错误1054(42S22):“field list”中的未知列“location_min”,所以在尝试这样做之后,将整个序列传递回来并在javascript客户端对其进行编辑,使用SQL子字符串不仅是更好的方法,也是唯一的方法。序列太长,当您试图检索整个内容时,它无法正确加载(显示任何内容也需要15秒)。所以我想你给我指出了正确的方向。@sage88。我想你可以用
location.fmin
location.fmax
来代替别名。唉,最后就这些了。此时无法使用别名。对于任何有类似问题的人,@Gordon Linoff关于使用非别名值的评论都会起作用。如果这样做的话,您不需要多个select语句。我不是在寻找特定的模式。我需要用索引值代替它。我将发布上面没有包含序列的查询,让您了解我所说的内容。那么您如何计算索引值呢?什么是位置最小值和位置最大值?如果它们是行中某个对象的函数,则需要在SUBSTRING命令中包含该函数,就像我对PATINDEX()所做的那样。换句话说,如果location_min=f(srcfeature.results),location_max=g(srcfeature.results),则需要在查询中放置子字符串(srcfeature.results,f(srcfeature.results),g(srcfeature.results))。它们必须是srcefeature.residuals的函数,否则您的location_min和location_max可能超出srcefeature.residuals长度的范围。如果location_min和location_max不是行中某个对象的函数,您可以将它们定义为存储过程中的参数或标量值
code
DECLARE@Location\u Min int
code
SET@Location\u Min=10它们是查询Location.fmin作为Location\u Min,Location.fmax作为Location\u max中SELECT语句的一部分。因此,它们在执行查询之前不是函数或已知。这就是为什么我认为我需要执行多个SELECT语句。一个用于检索位置值,另一个用于使用从上一个查询中获得的值对srcfeature.residuals进行子串。目前,我通过执行两个单独的顺序查询绕过了这个问题。
SELECT f.uniquename AS protein_accession, product.value AS protein_name,
       SUBSTRING(srcfeature.residues, location_min, location_max - location_min)  AS residue_sequence,
       srcassembly.name AS source_type, location.fmin AS location_min, location.fmax AS location_max, location.strand
FROM feature f
JOIN cvterm polypeptide ON f.type_id=polypeptide.cvterm_id
JOIN featureprop product ON f.feature_id=product.feature_id
JOIN cvterm productprop ON product.type_id=productprop.cvterm_id
JOIN featureloc location ON f.feature_id=location.feature_id
JOIN feature srcfeature ON location.srcfeature_id=srcfeature.feature_id
JOIN cvterm srcassembly ON srcfeature.type_id=srcassembly.cvterm_id
WHERE polypeptide.name = 'polypeptide'
AND productprop.name = 'gene_product_name'
AND product.value LIKE '%bifunctional GDP-fucose synthetase: GDP-4-dehydro-6-deoxy-D-mannose epimerase and GDP-4-dehydro-6-L-deoxygalactose reductase%';