2010-04-22 6 views
0

Je m'excuse pour le titre vague. J'essaie d'écrire une requête qui renvoie une colonne alias avec des valeurs correspondantes (résultant d'un IN) ainsi qu'une colonne d'alias avec des valeurs qui ne correspondent pas (en utilisant NOT IN). Je veux que le jeu de résultats ait: userId | matchs | non-concordances. J'ai actuellement la requête suivante qui renvoie les correspondances comme prévu. Je ne parviens pas à obtenir les non-appariements dans le jeu de résultats - qui est, d'un pas dans la déclarationCombinaison IN et NOT IN dans SQL comme résultat unique

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 

Ainsi, le PAS ressemblerait à quelque chose comme ceci:

goal_id NOT IN(SELECT uggg.goal_id FROM user_goal uggg WHERE [email protected]) AS nonmatches 

Je suis tout simplement pas vous comment incorporer le PAS dans ma déclaration requête si je reçois tous les résultats

Répondre

0

Essayez cette (pourrait être simplifié et optimisé si MySQL CTE ont bien):

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

groupe par un autre param, fixer un param qui sera utilisé s'il y a des objectifs de sous requête

+0

Je ne suis pas sûr que je comprends ce que vous entendez par "fixer un param", pouvez-vous m'expliquer? – RyanLynch

+0

il suffit de vérifier si l'objectif retourné appartient à l'utilisateur, puis définissez la valeur à "1" sinon placez-le à "0" et la valeur définie peut avoir l'alias "x" afin que vous puissiez les regrouper par user_id, x –

+0

Je ne comprends pas répondre. – Jodrell

0

Je pense que UNION est ce que vous avez besoin:

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

Merci, y a-t-il quelque chose que je dois changer avec le GROUP BY? – RyanLynch

+0

Je ne le pense pas, si votre liste de sélection est la même pour les deux parties de la requête. Je ne suis pas un mec mysql, donc je ne sais pas s'il y a d'autres exigences que j'ai ratées, mais ça me semble assez standard. – Ray