在in()-子句中带有sub-select的MySQL查询没有给出足够的结果



我构建了一个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,39135136,这正是我所期望的。然后我在外部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)

这给了我13953916861759,这也正是我所期望的。

现在我将两个查询组合在一起,第一个查询是第二个查询的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
)

结果只有139539,我不明白为什么它不是13953916861759。

有人知道为什么会出现这种情况吗?在in((中使用GROUP_CONNCT((列不应该如此罕见,对吧?

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
)

运算符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 ',',因为','是默认分隔符。

最新更新