【问题标题】:Unable to pass a variable containing a list of strings in MySQL into another query无法将包含 MySQL 中字符串列表的变量传递给另一个查询
【发布时间】:2014-10-06 22:51:00
【问题描述】:

我想创建一个存储多个字符串的变量,但我尝试过的任何方法似乎都不起作用。我有一个代码块(如下),如果我明确写出三个字符串,它就可以工作,但当我传递一个变量(我称之为@a)时,我认为它应该存储相同的确切字符串:

这是有问题的代码块供参考,当我写出 3 个字符串('ENSG00000120860'、'ENSG00000197894'、'ENSG00000273425')时,这就是我想要的:

SELECT 
ensp2, COUNT(DISTINCT (ensembl_gene_id))
FROM
(SELECT 
    s . *, g.ensembl_gene_id, g.associated_gene_name
FROM
    blang.string s
JOIN natashal.ensp_to_ensg_and_gene_symbol g ON g.ensembl_protein_id = s.ensp1
ORDER BY ensembl_gene_id) x
WHERE
ensembl_gene_id IN ('ENSG00000120860','ENSG00000197894','ENSG00000273425')
GROUP BY ensp2
ORDER BY COUNT(DISTINCT (ensembl_gene_id)) DESC

但是,我想将 ('ENSG00000120860','ENSG00000197894','ENSG00000273425') 设置为一个变量,因为它们会发生变化。我不是手动输入这些,而是​​从我得到的一列结果中列出它们。我试着这样做:

set @a = (SELECT GROUP_CONCAT(QUOTE(ensembl_gene_id) SEPARATOR ',') 
FROM (SELECT DISTINCT(ensembl_gene_id) FROM natashal.ensp_to_ensg_and_gene_symbol ORDER BY RAND() LIMIT 8) x)

困难在于@a 看起来应该很好地存储我的 3 个字符串,但没有这样做:

SELECT @a
>'ENSG00000120860','ENSG00000197894','ENSG00000273425'

我什至可以像这样在它周围加上括号:

SELECT CONCAT('(',@a,')')
>('ENSG00000120860','ENSG00000197894','ENSG00000273425')

这看起来可行,但是当我尝试将此引用传递给上面的代码块时,如下所示:

SELECT 
ensp2, COUNT(DISTINCT (ensembl_gene_id))
FROM
(SELECT 
    s . *, g.ensembl_gene_id, g.associated_gene_name
FROM
    blang.string s
JOIN natashal.ensp_to_ensg_and_gene_symbol g ON g.ensembl_protein_id = s.ensp1
ORDER BY ensembl_gene_id) x
WHERE
ensembl_gene_id IN (SELECT @a)
GROUP BY ensp2
ORDER BY COUNT(DISTINCT (ensembl_gene_id)) DESC

我没有得到我想要的结果,没有返回任何内容(也没有返回错误消息)。 MySQL 似乎认为它是一个空数组,或者它可能无法将字符串与表中的值匹配?

提前致谢,我们将不胜感激。

【问题讨论】:

    标签: mysql variables join where-in


    【解决方案1】:

    只使用子查询的结果:

    而不是

    WHERE
    ensembl_gene_id IN ('ENSG00000120860','ENSG00000197894','ENSG00000273425')
    

    拍摄:

    WHERE
    ensembl_gene_id IN (
        SELECT x.id FROM (
            SELECT DISTINCT(ensembl_gene_id) id 
            FROM natashal.ensp_to_ensg_and_gene_symbol 
            ORDER BY RAND() LIMIT 8
        ) x
    );
    

    要克服不能在子选择中使用LIMIT 子句的限制,您必须将子选择放入另一个子选择中。

    看看this fiddle中的原理。

    【讨论】:

    • 感谢您的回复。是的,我遇到了子条款中不允许行限制的限制,但是我不清楚您将子选择放入另一个中是什么意思?从这个问题的另一个答案看来,简单的表连接可能会解决这个问题
    【解决方案2】:

    问题

    WHERE
    ensembl_gene_id IN (SELECT @a)
    

    select @a 位的结果将被视为单个整体字符串。所以考虑到你的

    SELECT @a
    'ENSG00000120860','ENSG00000197894','ENSG00000273425'
    

    结果,你的主要查询实际上是功能等价于

    WHERE
    ensembl_gene_id IN ('\'ENSG00000120860\',\'ENSG00000197894\',\'ENSG00000273425\'')
    

    如果您想将@a 值用作实际的单独值,则需要使用存储过程,将主查询构建为字符串,然后使用exec 它,按照以下代码行:@ 987654321@.

    更好的解决方案是简单地将产生@a 值的查询嵌入到您的主查询中,但由于您使用的是LIMIT,因此这是不可能的。不过,您可以使用 JOIN 操作进行调查。

    【讨论】:

    • 谢谢马克,这很有帮助。我之前没有使用过随机数生成,并且对我仍然可以以正常方式将其他表连接到随机行的事实一无所知。我同意这里的存储过程路由可能过多
    猜你喜欢
    • 2021-10-04
    • 2019-12-04
    • 2020-11-13
    • 2022-11-27
    • 2017-11-15
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    相关资源
    最近更新 更多