我被这个简单的查询困住了,因为它之前没有尝试过。简单的MySQL连接问题
我有一个用户表,User_Widget表和一个Widget表。
一个简单的内部联接通过加入user_widget.user_id = user.user_id向我显示他们拥有哪些小部件。
我将如何在Widget表中显示他们没有的小部件?
我被这个简单的查询困住了,因为它之前没有尝试过。简单的MySQL连接问题
我有一个用户表,User_Widget表和一个Widget表。
一个简单的内部联接通过加入user_widget.user_id = user.user_id向我显示他们拥有哪些小部件。
我将如何在Widget表中显示他们没有的小部件?
感谢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
干杯家伙
查找WHERE您的文档子查询中NOT EXISTS ..
这是一个猜测,(我还没有尝试过),但试试这个:
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
使用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
SELECT * FROM widgets WHERE id NOT IN
(
SELECT widget_id FROM user_widgets WHERE user_id = 1
)
(其中1是你感兴趣的用户的ID)
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;
我只想在个人和令人讨厌的笔记上补充一下,CR OSS JOIN可能是我最喜欢的连接。很少使用,但在某些情况下效果很好。 – 2010-01-19 17:23:48