2010-01-19 11 views
1

Je suis bloqué par cette simple requête car c'est celle que je n'ai pas essayée auparavant. J'ai reçu une table utilisateur, une table User_Widget et une table Widget. Une jointure interne simple me montre quels widgets ils ont en rejoignant user_widget.user_id = user.user_id.Problème de jointure MySQL simple

Comment afficher les widgets dans la table Widget qu'ils n'ont pas?

Répondre

0

Merci à Bart Janson la requête que j'ai eu jusqu'à:

SELECT * FROM widgets 
WHERE NOT EXISTS (
SELECT * FROM widget_user 
WHERE widgets.widget_id = widget_user.widget_id 
AND user_id = "ID NUMBER OF PERSON YOU WANT" 
) 
ORDER BY RAND() 
LIMIT 10 

Vive les gars

1

Cherchez OÙ EXISTE PAS avec une sous-sélection dans la documentation ..

0

Ceci est une supposition, (je l'ai pas essayé), mais essayez ceci:

Select Distinct u.*, Z.* 
From User u 
    Left Join 
     (Select u.UserId, w.* 
     From Widget w 
     Where Not Exists 
       (Select * From User_Widget 
       Where userId = u.UserId 
        And widgetId = w.WidgetId)) Z 
    On Z.userId = u.UserId 
1

Utilisez un CROSS JOIN et un LEFT OUTER JOIN (c'est de mon expérience de MS SQL, mais le concept devrait tenir).

Cela fonctionne comme ceci. La sous-requête obtient toutes les combinaisons possibles d'utilisateur et de widget. Le LEFT OUTER JOIN met vos associations User_Widgets en jeu. LEFT OUTER JOIN

La partie IS NULL de la clause WHERE exclura les widgets que possède l'utilisateur, en ne donnant que ceux qui ne le sont pas.

SELECT allpossible.User_ID, allpossible.Widget_ID FROM 
(
    SELECT User_ID, Widget_ID FROM 
    Users 
    CROSS JOIN 
    Widgets 
) allpossible 
LEFT OUTER JOIN 
    User_Widgets uw 
ON 
    allpossible.User_ID = uw.User_ID 
AND allpossible.Widget_ID = uw.Widget_ID 
WHERE 
    uw.UserID IS NULL 
+0

Je voudrais juste ajouter, sur une note personnelle et geek, que le CR OSS JOIN est probablement ma jointure préférée. Rarement utilisé, mais idéal pour certaines situations. –

0
SELECT * FROM widgets WHERE id NOT IN 
(
    SELECT widget_id FROM user_widgets WHERE user_id = 1 
) 

(où 1 est l'identifiant de l'utilisateur qui vous intéresse)

0
SELECT * 
FROM widgets w 
LEFT OUTER JOIN user_widget uw 
ON w.id = uw.widget_id AND uw.user_id = 1 // or whatever user u want 
WHERE uw.widget_id IS NULL;