Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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查询以选择除_Sql_Mysql - Fatal编程技术网

mysql查询以选择除

mysql查询以选择除,sql,mysql,Sql,Mysql,我有两个mysql表 第一个称为select,由id、user\u id和widget\u id字段组成 另一个称为widgets,它包括一些东西,包括widget\u id 我创建了一个过滤器,用户可以显示他/她选择的小部件,也可以显示他/她没有选择的小部件。对于他选择的那些,我使用以下方法: SELECT * FROM widgets, chosen WHERE chosen.user_id = $user_id AND chosen.widget_id = widgets

我有两个mysql表

第一个称为select,由id、user\u id和widget\u id字段组成

另一个称为widgets,它包括一些东西,包括widget\u id

我创建了一个过滤器,用户可以显示他/她选择的小部件,也可以显示他/她没有选择的小部件。对于他选择的那些,我使用以下方法:

SELECT * 
  FROM widgets, chosen 
 WHERE chosen.user_id = $user_id 
   AND chosen.widget_id = widgets.widget_id
但是,我不知道如何显示他/她没有选择的内容。这不起作用,显示所有内容:

SELECT * 
  FROM widgets, chosen 
 WHERE !(    chosen.user_id = $user_id 
         AND chosen.widget_id = widgets.widget_id)
我该怎么做?

布尔逻辑:ab'与a'+b'相同


基本上,您希望从为给定$user\u id选择的窗口小部件中选择没有关联行的所有行。您可以通过左外部联接查找所选表中不匹配的行来完成此操作。大概是这样的:

SELECT w.* FROM widgets as w
LEFT OUTER JOIN chosen as c on c.widget_id=w.widget_id AND c.user_id=$user_id
WHERE c.id IS NULL;
顺便说一句:我建议使用较新的联接语法,而不是逗号分隔的表联接语法。它更容易阅读和理解,尤其是当涉及到外部联接时。

使用NOT IN: 使用不存在: 左联接/左联接为空: 性能:
如果是的话。如果需要。

谢谢!我最后使用了SELECT*from widgets w,其中w.widget\u id不在SELECT w.widget\u id from widgets w中,选择了c,其中c.widget\u id=w.widget\u id和c.user\u id=$user\u id
SELECT w.* FROM widgets as w
LEFT OUTER JOIN chosen as c on c.widget_id=w.widget_id AND c.user_id=$user_id
WHERE c.id IS NULL;
SELECT w.*
  FROM WIDGET w
 WHERE w.widget_id NOT IN (SELECT c.widget
                             FROM CHOSEN c
                            WHERE c.user_id = $user_id)
SELECT w.*
  FROM WIDGET w
 WHERE NOT EXISTS (SELECT NULL
                     FROM CHOSEN c
                    WHERE c.widget_id = w.widget_id 
                      AND c.user_id = $user_id)
   SELECT w.*
     FROM WIDGET w
LEFT JOIN CHOSEN c ON c.widget_id = w.widget
                  AND c.user_id = $user_id
    WHERE w.widget IS NULL