MySQL 在 IN() 子句中使用子 select 的查询给出的结果不足
MySQL query with sub-select in IN()-clause gives not enough results
我构建了一个 sql 查询,但没有得到我期望的结果。我试图解释我对 sql 语句的步骤是什么。
首先,我有在 IN() 子句中使用的子 select:
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-statement:
中使用这些连续数字
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:
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() 列应该不罕见吧?
group_concat()
给你一个 comma-separated string;将此作为操作数传递给运算符 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 ','
,因为 ','
是默认分隔符。
我构建了一个 sql 查询,但没有得到我期望的结果。我试图解释我对 sql 语句的步骤是什么。
首先,我有在 IN() 子句中使用的子 select:
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-statement:
中使用这些连续数字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:
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() 列应该不罕见吧?
group_concat()
给你一个 comma-separated string;将此作为操作数传递给运算符 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 ','
,因为 ','
是默认分隔符。