admin

mysql查询选择所有内容,除了

sql

我有两个mysql表。

第一个称为“选择”,由id,user_id和widget_id字段组成。

另一个称为“小部件”,包括widget_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)

我该怎么做呢?


阅读 164

收藏
2021-05-10

共1个答案

admin

使用NOT IN:

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

表现:

如果比较列(任一表中的widget_id)不可为空,则LEFT JOIN / IS
NULL在MySQL上表现最佳
。如果列可为空(值可以为NULL),则NOT IN或NOT
EXISTS的性能更好

2021-05-10