当前位置: 首页 > 面试题库 >

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

堵雅健
2023-03-14
问题内容

我有两个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)

我该怎么做呢?


问题答案:

使用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的性能更好



 类似资料:
  • 问题内容: 我有一个相当复杂的查询,它从三个表中获取数据,现在我希望它变得更加复杂(哦,亲爱的)! 我希望最后发布的功能显示在页面的自己的部分中,通过选择表中的最后一个条目,这很容易。但是,对于复杂的查询(网站的主页),我希望不能显示此功能。 我想将以下查询恢复为上一个查询,但未返回正确的结果: 该查询返回以下错误: MySQL错误:#1111-无效使用组函数 有没有办法解决? 问题答案: 该查询

  • 本文向大家介绍MySQL 选择所有列(*),包括了MySQL 选择所有列(*)的使用技巧和注意事项,需要的朋友参考一下 示例 询问 结果 您可以通过执行以下操作从一个连接的一个表中选择所有列: 最佳实践*除非正在调试或获取row(s)关联数组,否则不要使用,否则架构更改(ADD / DROP /重新排列列)可能会导致讨厌的应用程序错误。另外,如果提供结果集中所需的列列表,MySQL的查询计划程序通

  • 问题内容: 我有一个名为faq_questions的表,其结构如下: 我试图建立一个给定排序顺序的查询,选择具有最高排序顺序的行。 例子: 好的,假设我为已知的排序顺序(id 4)输入了5,我需要它返回ID为3的行。由于不能保证sort_order是连续的,所以我不能只选择known_sort_order + 1。 谢谢! 问题答案: 似乎太简单了,但是看起来像您所需要的:

  • 问题内容: 我想选择位于最右侧的某个字符(-)之后的所有内容。 例如。 我想选择零件 谢谢! 问题答案: 您可以使用:

  • 本文向大家介绍使用MySQL子查询选择年龄最大的所有用户?,包括了使用MySQL子查询选择年龄最大的所有用户?的使用技巧和注意事项,需要的朋友参考一下 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是查询以选择具有最大年龄值的所有用户- 这将产生以下输出-

  • 问题内容: 我正在寻找一个SQL查询来选择所有未由同一表上的另一个查询选择的记录。具体来说,我想选择所有具有特定字段(’fieldA’)重复项的记录,然后删除除其中一个记录以外的所有记录。 因此,一条select语句可能类似于以下内容(不起作用!): 如果不可能进行单个查询,那么最有效的解决方案是什么? 问题答案: 具体来说,我想选择所有具有特定字段(’fieldA’)重复项的记录,然后删除除其中