Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单的MySQL连接问题_Mysql_Join - Fatal编程技术网

简单的MySQL连接问题

简单的MySQL连接问题,mysql,join,Mysql,Join,我被这个简单的查询难住了,因为它是我以前从未尝试过的 我有一个用户表,用户表和小部件表 一个简单的内部连接通过连接user\u widget.user\u id=user.user\u id向我展示了它们有哪些小部件 如何在小部件表中显示它们没有的小部件?使用文档中的子选择查找不存在的小部件。这是一个猜测,(我没有尝试过),但尝试一下: Select Distinct u.*, Z.* From User u Left Join (Select u.UserId, w.*

我被这个简单的查询难住了,因为它是我以前从未尝试过的

我有一个用户表,用户表和小部件表

一个简单的内部连接通过连接user\u widget.user\u id=user.user\u id向我展示了它们有哪些小部件


如何在小部件表中显示它们没有的小部件?

使用文档中的子选择查找不存在的小部件。

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

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

使用交叉连接和左外连接(这是我的MS SQL经验,但这个概念应该适用)

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

左边的外部连接使您的用户与小部件关联发挥作用

WHERE子句的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

(其中1是您感兴趣的用户的id)

感谢Bart Janson,我将查询结果归结为:

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

干杯伙计们

我想补充一点,就个人而言,交叉连接可能是我最喜欢的连接。很少使用,但适用于某些情况。
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;
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;