Navicat 博客

选择只有一个值的行 2020 年 7 月 6 日,由 Robert Gravelle 撰写

在数据库开发和管理中,获取只有一个特定值的行是相当常见的任务。这听起来好像很简单,但是将结果限制在那些只具有一个值而又不包含其他值的行上,这比听起来要棘手。原因是,虽然使用 != 不等于或 NOT IN 比较运算符筛选值是很简单,但它们仅隐藏不匹配的值,而不是告诉我们实际是否拥有其他值。好消息是,有一种简单的方法可以做到这一点。请继续阅读,了解如何做到!

按角色选择用户

所有数据库以及大多数应用程序都有用户。特别是,数据库用户倾向于拥有不同的角色。(尽管应用程序用户也可以有角色。)以下是 Navicat 的表设计器中此类表的例子:

user_roles_table_design (92K)

在这种情况下,role_id 是一个外键(FK),它链接到一个角色表,该表将存储有关每个角色的其他信息。在用户表中,包含 role_id 会导致每个用户有多行的可能性。请记住这一点,因为稍后我们会再次讨论这点。

user_roles_table (37K)

列出只有一个角色的用户的错误方式

如果现在要列出拥有仅具一个特定用户角色的用户,我们可能要编写类似以下的查询:

role_id_equal_to_1 (33K)

问题在于上面的查询仅列出了 role_id 为 1 的用户。它并不能让我们知道他们是否也具有其他 role_id。此外,添加其他条件(例如 AND role_id NOT IN (2,3,4,5,6,7,8,9))无济于事,因为 1 显然不是唯一的其他数字!

那么,如何将用户限制为只有 role_id 为 1 且没有其他角色的用户?

列出只有一个角色的用户的正确方法

从技术上讲,这不是“正确的方法”,因为肯定还有其他方法。该解决方案包括计算每个用户的行数。这个想法是,如果一个用户拥有我们感兴趣的 role_id 并且表中只有一行,那么他们就是我们想要在结果中看到的用户。

我们可以使用 GROUP BY 获得表中每个用户的 user_id 计数。然后,HAVING 子句可以检查用户是否只有一行,并且他或她的一个 role_id 是否我们想要的:

final_query (31K)

现在,我们只看到一个 role_id 为 1 的用户,而他没有其他 role_id!

总结

这种方法的优点是可以轻松地对修改查询,以查找表中包含多个值或超过特定行数的行。

如果你对 Navicat Premium 感兴趣,可以免费试用14 天!

Navicat 文章
频道条目
分享
文章归档