[英]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.