2010-01-19 101 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;