2010-01-19 66 views
1

我被这个简单的查询困住了,因为它之前没有尝试过。简单的MySQL连接问题

我有一个用户表,User_Widget表和一个Widget表。

一个简单的内部联接通过加入user_widget.user_id = user.user_id向我显示他们拥有哪些小部件。

我将如何在Widget表中显示他们没有的小部件?

回答

0

感谢Bart詹森我查询到:

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 

干杯家伙

1

查找WHERE您的文档子查询中NOT EXISTS ..

0

这是一个猜测,(我还没有尝试过),但试试这个:

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

使用CROSS JOIN和一个左外连接(这是从我的MS SQL经验,但这个概念应该保留)。

它的工作原理是这样的。子查询获取用户和小部件的所有可能组合。

LEFT OUTER JOIN使您的User_Widgets关联发挥作用。

WHERE CLAUSE的IS NULL部分将排除用户具有的小部件,只给出那些不包含小部件的部件。

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

我只想在个人和令人讨厌的笔记上补充一下,CR OSS JOIN可能是我最喜欢的连接。很少使用,但在某些情况下效果很好。 – 2010-01-19 17:23:48

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

(其中1是你感兴趣的用户的ID)

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;