【问题标题】:MySQL query with sub-select in IN()-clause gives not enough results在 IN() 子句中使用子选择的 MySQL 查询没有给出足够的结果
【发布时间】:2020-09-23 13:08:47
【问题描述】:

我构建了一个 sql 查询,但没有得到我期望的结果。我试图解释我对 sql 语句的步骤是什么。

首先我有我在 IN() 子句中使用的子选择:

SELECT GROUP_CONCAT(job_id SEPARATOR ',') as job_ids
FROM candidate_job
WHERE candidate_id = 1111
GROUP BY candidate_id

结果是 1,7,37,38,39,135,136,这正是我所期望的。 然后我在我的外部 sql 语句中使用这些合并的数字:

SELECT GROUP_CONCAT(DISTINCT(user_id) SEPARATOR ',') as user_ids
FROM user_job
WHERE job_id IN (1,7,37,38,39,135,136)

这给了我 139,539,1686,1759,这也正是我所期望的。

现在我结合两个查询,第一个是第二个的 IN() 子句的子选择:

SELECT GROUP_CONCAT(DISTINCT(user_id) SEPARATOR ',') as user_ids
FROM user_job
WHERE job_id IN (
    SELECT GROUP_CONCAT(job_id SEPARATOR ',') as job_ids
    FROM candidate_job
    WHERE candidate_id = 1111
    GROUP BY candidate_id
)

结果只有 139,539,我不明白为什么它不是应该的 139,539,1686,1759。

有人知道为什么会这样吗?在 IN() 中使用 GROUP_CONCAT() 列应该不会那么罕见吧?

【问题讨论】:

    标签: mysql sql subquery where-clause


    【解决方案1】:

    group_concat() 给你一个逗号分隔的字符串;将此作为操作数传递给操作员 in 并不能满足您的要求(最终会搜索完全匹配)。

    我会推荐exists

    SELECT GROUP_CONCAT(DISTINCT(user_id) SEPARATOR ',') as user_ids
    FROM user_job uj
    WHERE EXISTS (
        SELECT 1
        FROM candidate_job cj
        WHERE cj.candidate_id = 1111 AND uj.job_id = cj.job_id
    )
    

    【讨论】:

    • 谢谢你!我将子选择中的 1 更改为 job_id,现在它就像一个魅力! :)
    • @Vencarii,与存在子句一起使用时内部子选择的结果,被查询引擎忽略。所以即使你写NULL而不是1或Job_id,它也会产生同样的结果。
    【解决方案2】:

    运算符 IN 不适用于逗号分隔值的字符串。
    你要的是FIND_IN_SET():

    SELECT GROUP_CONCAT(DISTINCT user_id) as user_ids
    FROM user_job
    WHERE FIND_IN_SET(
            job_id,  
            (SELECT GROUP_CONCAT(job_id) FROM candidate_job WHERE candidate_id = 1111)
    )
    

    SEPARATOR ',' 不需要,因为',' 是默认分隔符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多