繁体   English   中英

将SQL中的IN和NOT IN组合为单个结果

[英]Combining IN and NOT IN in SQL as single result

对于模糊的标题,我深表歉意。 我试图写一个返回匹配值(从IN产生的)的别名列的查询以及与不匹配值的别名柱(使用NOT IN)。 我希望结果集具有:userId | 火柴| 不匹配。 目前,我有以下查询按预期它返回匹配。 我在获取结果集中的不匹配时遇到了麻烦-即从NOT IN语句

SET @userId = 9;
SELECT ug.user_id, COUNT(DISTINCT goal_id) as matches
FROM user_goal ug
WHERE ug.user_id!=@userId
AND goal_id IN (SELECT iug.goal_id FROM user_goal iug WHERE user_id=@userId)
GROUP BY user_id ORDER BY matches DESC LIMIT 4

因此,NOT IN看起来像这样:

goal_id NOT IN(SELECT uggg.goal_id FROM user_goal uggg WHERE user_id=@userId) AS nonmatches

我只是不确定如何在查询中合并NOT IN语句,所以我得到了所有结果

将其按另一个参数分组,修复子查询中有目标时将使用的一个参数

我认为您需要一个UNION:

SET @userId = 9;

SELECT ug.user_id, COUNT(DISTINCT goal_id) as matches
FROM user_goal ug
WHERE ug.user_id!=@userId
AND goal_id IN (SELECT iug.goal_id FROM user_goal iug WHERE user_id=@userId)
GROUP BY user_id ORDER BY matches DESC LIMIT 4

union all

SELECT ug.user_id, COUNT(DISTINCT goal_id) as matches
FROM user_goal ug
WHERE ug.user_id!=@userId
AND goal_id NOT IN(SELECT uggg.goal_id FROM user_goal uggg WHERE user_id=@userId)
GROUP BY user_id ORDER BY matches DESC LIMIT 4

试试这个(如果mysql有CTE,可以简化并进一步优化):

select u.user_id, the_matches.matches, the_nonmatches.nonmatches
from user u 
left join 
(    
    SELECT ug.user_id, COUNT(DISTINCT goal_id) as matches
    FROM user_goal ug
    WHERE ug.user_id!=@userId
    AND goal_id IN (SELECT iug.goal_id FROM user_goal iug WHERE user_id=@userId)
    GROUP BY user_id 
    ORDER BY matches DESC LIMIT 4
) as the_matches on the_matches.user_id = u.user_id
left join
(
    SELECT ug.user_id, COUNT(DISTINCT goal_id) as nonmatches
    FROM user_goal ug
    WHERE ug.user_id!=@userId
    AND goal_id NOT IN(SELECT uggg.goal_id FROM user_goal uggg WHERE user_id=@userId) 
    GROUP BY user_id 
) as the_nonmatches on the_nonmatches.user_id = u.user_id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM