2010-04-22 76 views
0

对于模糊标题,我表示歉意。我正在尝试编写一个查询,该查询返回具有匹配值(由IN产生)的别名列以及具有不匹配值(使用NOT IN)的别名列。我希望结果集具有:userId |匹配| nonmatches。我目前有以下查询返回匹配如预期。我遇到麻烦nonmatches结果集 - 也就是说,从NOT IN声明在SQL中结合IN和NOT IN作为单一结果

SET @userId = 9; 
SELECT ug.user_id, COUNT(DISTINCT goal_id) as matches 
FROM user_goal ug 
WHERE [email protected] 
AND goal_id IN (SELECT iug.goal_id FROM user_goal iug WHERE [email protected]) 
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 [email protected]) AS nonmatches 

我只是不确定如何把NOT IN语句在我的查询,所以我得到的所有结果

回答

0

试试这个(可以简化并进一步优化如果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 [email protected] 
    AND goal_id IN (SELECT iug.goal_id FROM user_goal iug WHERE [email protected]) 
    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 [email protected] 
    AND goal_id NOT IN(SELECT uggg.goal_id FROM user_goal uggg WHERE [email protected]) 
    GROUP BY user_id 
) as the_nonmatches on the_nonmatches.user_id = u.user_id 
0

通过彼此PARAM组它,修复,如果有从子查询的目标,这将被用于一个PARAM

+0

我不知道我明白你的意思了“修理一个参数”,你能解释一下吗? – RyanLynch 2010-04-22 13:46:15

+0

只是检查返回的目标是否属于用户,然后将某些值设置为“1”,否则将其设置为“0”,并且seted值可以具有别名“x” ,以便您可以按照user_id,x – 2010-04-22 14:00:32

+0

对它们进行分组我不明白回答。 – Jodrell 2012-11-15 11:15:07

0

,我认为联合是你所需要的:

SET @userId = 9; 

SELECT ug.user_id, COUNT(DISTINCT goal_id) as matches 
FROM user_goal ug 
WHERE [email protected] 
AND goal_id IN (SELECT iug.goal_id FROM user_goal iug WHERE [email protected]) 
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 [email protected] 
AND goal_id NOT IN(SELECT uggg.goal_id FROM user_goal uggg WHERE [email protected]) 
GROUP BY user_id ORDER BY matches DESC LIMIT 4 
+0

谢谢,有什么我需要改变GROUP BY? – RyanLynch 2010-04-22 13:58:49

+0

我不这么认为,如果你的选择列表对于查询的两个部分是相同的。我不是一个mysql的人,所以我不知道是否有其他需求,我错过了,但它看起来像标准的东西给我。 – Ray 2010-04-22 14:09:11