在主查询的“IN”子句中使用逗号分隔列表的子查询结果

Posted

技术标签:

【中文标题】在主查询的“IN”子句中使用逗号分隔列表的子查询结果【英文标题】:use result from subquery with comma separated list in "IN" clausule of main query 【发布时间】:2018-02-13 18:10:48 【问题描述】:

我有 2 张桌子: - 一个(用户)在名为 login 的列中包含每个用户的首字母 - 另一个(任务计划的)在名为 userId 的列中包含相同的首字母。 我需要从匹配条件“技术员”的“用户”表中选择所有用户,然后我需要从与这些用户匹配的任务计划中选择所有任务。

我已经构建了以下查询:

SELECT
tp.*
FROM
taskplanned tp
WHERE
tp.userId IN (
    SELECT
        (
            GROUP_CONCAT(CONCAT('''', login, ''''))
        )
    FROM
        users u
    WHERE
        u.cis_role LIKE '%technician%'
)

当独立运行子查询时,它会显示: 'BDG','FG','BJ','WDG','NDW','TV','SA','JV','GW','MU','KD','LV','KL ','TDW','DK','KDS','PD','WB'

所以,我假设在主查询的“IN”子句中插入这部分时,它应该可以工作。不幸的是,它不是。我在这里遗漏了什么吗?

如果我从子查询中获取结果并将其手动添加到主查询中,它就像一个魅力..

【问题讨论】:

【参考方案1】:

GROUP_CONCAT() 不是必需的。就这样做吧:

SELECT
tp.*
FROM
taskplanned tp
WHERE
tp.userId IN (
    SELECT
        login
    FROM
        users u
    WHERE
        u.cis_role LIKE '%technician%'
)

当这是一对一的关系时,更好的方法是加入:

SELECT
tp.*
FROM
taskplanned tp
JOIN users u ON tp.userId = u.login
WHERE u.cis_role LIKE '%technician%'

【讨论】:

【参考方案2】:

mysql SELECT * FROM taskplanned WHERE userId IN ( SELECT login FROM users WHERE cis_role LIKE '%technician%')

你不需要组连接..

【讨论】:

以上是关于在主查询的“IN”子句中使用逗号分隔列表的子查询结果的主要内容,如果未能解决你的问题,请参考以下文章