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

选择在不同行上满足不同条件的值?

空夕
2023-03-14
问题内容

这是我无法弄清楚的非常基本的查询。

假设我有一个两列的表格,如下所示:

userid  |  roleid
--------|--------
   1    |    1
   1    |    2
   1    |    3
   2    |    1

我想获取所有具有roleids1、2和3的不同用户ID 。使用上面的示例,我要返回的唯一结果是userid1。我该怎么做?


问题答案:
SELECT userid
FROM UserRole
WHERE roleid IN (1, 2, 3)
GROUP BY userid
HAVING COUNT(DISTINCT roleid) = 3;

任何人阅读本:我的答案是简单明了的,并得到了“接受”的地位,但请不要去阅读答案通过@cletus给出。它具有更好的性能。

只是大声思考一下,@ cletus所描述的编写自联接的另一种方法是:

SELECT t1.userid
FROM userrole t1
JOIN userrole t2 ON t1.userid = t2.userid
JOIN userrole t3 ON t2.userid = t3.userid
WHERE (t1.roleid, t2.roleid, t3.roleid) = (1, 2, 3);

这对您来说可能更容易阅读,并且MySQL支持类似的元组比较。MySQL还知道如何针对此查询智能地利用覆盖索引。只需运行它,EXPLAIN并在所有三个表的注释中看到“使用索引”,这意味着它正在读取索引,甚至不必触摸数据行。

我在Macbook上使用MySQL 5.1.48对这个查询进行了210万行查询(PostTag的Stack Overflow
7月数据转储),它在1.08秒内返回了结果。在分配了足够内存的体面服务器上innodb_buffer_pool_size,它甚至应该更快。



 类似资料:
  • 问题内容: 我有一个名为“工作”的表。对于特定用户,作业可以是活动的,已归档的,过期的,待处理的或已关闭的。现在,每个页面请求都生成5个COUNT查询,为了进行优化,我试图将其减少为单个查询。到目前为止,这是我所拥有的,但这仅比5个单独的查询要快。请注意,我已经简化了每个子查询的条件,以使其更易于理解,但是完整查询的行为相同。 有没有一种方法可以在不使用无效子查询的情况下在同一查询中获得这5个计数

  • 问题内容: 给定以下示例表架构 客户表 发票表 目的是选择InvoiceID值为10和20(非OR)的所有客户。因此,在此示例中,将返回带有CustID = 1和2的客户。 您将如何构造SELECT语句? 问题答案: 使用: 关键是需要计数等于子句中参数的数量。 的使用是在对帐务编号和发票编号的组合没有唯一约束的情况下- 如果没有重复的机会,则可以从查询中省略DISTINCT:

  • 这似乎很简单,但我似乎无法理解。我知道如何将pandas数据帧过滤到满足条件的所有行,但当我想要相反的结果时,我总是会遇到奇怪的错误。 这是一个例子。(上下文:一个简单的棋盘游戏,棋子在网格上,我们试图给它一个坐标,并返回所有相邻的棋子,但不是实际坐标上的实际棋子) 我认为应该只是否定后面括号中的布尔值,但这似乎不是它的工作方式。 我想让它在5,6时归还母牛,而不是在5,7时归还狼(因为这是当前的

  • 问题内容: 假设我有这个(MySQL)数据库,按增加的时间戳排序: 如何从该系统的上一行中选择StatusA更改的行?StatusB无关紧要(我在此问题中展示它只是为了说明每个系统可能有许多连续的行,其中StatusA不变)。在上面的示例中,查询应返回2011-01-03行(对于SystemA,StatusA在2011-01-01和2011-01-03之间更改),2011-01-06、2011-0

  • 我们知道在Spark中有三种类型的连接——广播连接、随机连接和排序合并连接: 当小表连接大表时,使用广播加入; 当小表大于广播加入阈值时,使用随机连接; 当大表连接,并且连接键可以排序时,使用排序-合并连接; 如果存在两个大表的连接并且无法对连接键进行排序,会发生什么情况?Spark 将选择哪种联接类型?

  • 问题内容: 我有一个看起来像这样的表: 我想运行一个查询,该查询将选择唯一的ID和值作为命名列,因此它看起来像这样: 任何帮助将非常感激!! 问题答案: 您可以使用以下简单解决方案: 为了安全起见,我创建了join ,因为我不知道id是否可以包含 缺少的 字段,在这种情况下,它们将显示在我们的派生列中。 SQL提琴演示