查找具有唯一两列组合的所有行

2024-05-27

我有这张桌子messages;

sender_id    recipient_id
1            2
1            3
1            3
2            1
3            1
2            3

我希望选择这样的行:

  1. Either sender_id or receiver_id = current_user.id.
  2. 其他字段应该是唯一的。

IE。我想从表中选择唯一的sender_id = 2 or recipient_id = 2我需要这个结果:

sender_id    recipient_id
2            1
2            3

怎么做?
为什么?因为我希望构建一个类似 facebook 的收件箱,其中聚合发送和接收的消息,而这个查询是迄今为止的瓶颈。

我使用的是 Rails 3.2 和 Postgres 9.3。


SELECT sender_id AS user_id, recipient_id AS other_user_id
FROM   messages
WHERE  sender_id = $current_user_id

UNION
SELECT recipient_id, sender_id
FROM   messages
WHERE  recipient_id = $current_user_id
-- ORDER BY 1, 2  -- optional

UNION (not UNION ALL) 从结果中删除重复项DISTINCT不必要。 您可能想添加ORDER BY最后用于排序输出。

假设一个大表具有相对较少的合格行,则两个 Btree 索引通常可以提供最佳性能。一个带前导或仅一个sender_id,另一个带前导或仅recipient_id.

单个多列索引 https://www.postgresql.org/docs/current/indexes-multicolumn.html on (sender_id, receiver_id)反之亦然也可以,但通常速度较慢。看:

  • 复合索引也适合第一个字段的查询吗? https://dba.stackexchange.com/a/27493/3684
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找具有唯一两列组合的所有行 的相关文章

随机推荐

  • 带有 CosmosDBTrigger 的 Azure 函数似乎不是由 upsert 触发的

    我是第一次使用 Azure Functions 我正在尝试编写一个简单的函数来响应更改或添加到 CosmosDb 集合中的文档 我写的函数如下所示 FunctionName ChangeLog public static void Run
  • MPI_Type_Create_Hindexed_Block 生成派生数据类型的错误范围

    使用Fortran 我尝试为动态分配的结构构建派生数据类型 但它得到了新类型的错误范围 代码如下 PROGRAM MAIN IMPLICIT NONE INCLUDE mpif h INTEGER I INTEGER MYID NUMPRO
  • 我可以让 lein cloverage 跳过特定测试吗?

    我正在进行一个 Leiningen 项目 其集成测试注释如下 deftest manual test v3 preview preview client http localhost 10313 v3 preview 当我这样做时 这些测试
  • Web.GetFileByServerRelativeUrl 抛出“值未落在预期范围内”

    我有一个存储文档的 SP Online 站点 添加 检索文档没有任何问题 但在删除流程中 我在检索文档时遇到错误File object public static void DeleteDocument using ClientContex
  • Oracle中表的列重新排序

    我有一个包含 50 多列的表 我需要交换前两列的顺序 使用 Oracle 实现此目的的最佳方法是什么 假设表名是 ORDERDETAILS 前两列是 ITEM ID 和 ORDER ID 重命名完成后 表名仍应为 ORDERDETAILS
  • ASP.NET 4.0 中的模拟 HttpRequest

    我见过很多类似的帖子 但没有一个能真正解决我的特殊情况 我正在 ASP NET 4 0 Web 应用程序 ASP NET Forms 而不是 MVC 中编写单元测试 代码中有几个地方我称之为ServerVariables调用变量的集合 例如
  • 如何使用joda时间将固定的毫秒数格式化为hh:mm:ss?

    我输入了 34600 毫秒 我想以 00 00 34 HH MM SS 的格式输出 为此我应该查看 JDK Joda time 的哪些类 我需要它是高效的 最好是线程安全的 以避免每次解析时创建对象 谢谢 编辑 使用此代码提供时区敏感的结果
  • 使用 JSONDecoder 解码的对象的打印输出出现问题

    我正在尝试快速解码 JSON 字符串 但在解码后访问属性时遇到一些奇怪的问题 这是我从本地存储的 JSON 文件检索的 JSON 文件的内容 word a usage partOfSpeech determiner 这是访问 JSON 文件
  • Backbone.js 模型或视图中的类私有属性

    模型中是否可以拥有私有属性 就像 构造函数 函数中本地声明的变量一样 不附加到this 但仅在 构造函数 函数中定义的内容在本地声明且可见 没有 BB 视图的示例 function MyView aModel var internalInp
  • 在for循环中重命名ggplot2图

    我有一个关于在 for 循环中创建 ggplot2 图表 根据迭代重命名它们 然后在网格中排列图表的问题 我想做类似这个虚拟示例的事情 library ggplot2 a c 1 2 3 b c 4 5 6 for i in c 1 5 x
  • 搜索 Outlook 全局地址列表

    我正在从 Outlook 中提取全局地址列表 如下所示 Microsoft Office Interop Outlook Application oApp new Microsoft Office Interop Outlook Appli
  • 无法启动 Spark-Shell

    我使用的是 Spark 1 4 1 我可以毫无问题地使用spark submit 但当我跑的时候 spark bin spark shell 我收到以下错误 我已经配置了SPARK HOME and JAVA HOME 不过 Spark 1
  • 如何销毁/卸载 vue.js 3 组件?

    我有一个相当大的vue js 2具有动态选项卡机制的应用程序 用户可以与应用程序打开和关闭选项卡进行交互 每个选项卡代表一条路线 为了实现这一点 我使用 vue router 并保持活动状态 如下例所示
  • 如何使用 mingw gcc 链接 msvcr90.dll?

    如何使用 mingw gcc 链接 msvcr90 dll 我尝试了 lmsvcr90 这是最小的示例 include
  • 获取动画 UIImageview 的坐标

    我正在水平位置对 UIImageview 进行动画处理 为此我使用了下面的代码我使用了 NSTimer timer NSTimer scheduledTimerWithTimeInterval 0 2 target self selecto
  • 手机纵向,平板电脑横向(Android 布局)

    所以我正在为 Android 制作一个应用程序 我想强制平板电脑横向方向和手机纵向方向 然而 似乎我只能根据我所看到的进行方向锁定 这违背了想要设备有两个单独方向的目的 平板电脑 横向 手机 纵向 说得更技术一点 我在 res layout
  • 在不同的 python 补丁版本上运行 tox

    简而言之 有没有办法tox循环使用Python的补丁版本 Long 我希望测试在 2 7 7 2 7 8 等上运行 基本上我是在 2 7 6 上运行 想看看是否可以摆脱这个警告 https urllib3 readthedocs org e
  • java.lang.IllegalArgumentException:在 MongoDB 中执行聚合的引用无效

    我收集了一份文件 id ObjectId 5ab273ed31fa764560a912f8 hourNumber 21 errorSegments agentName agentX agentName agentY 我正在尝试在 Sprin
  • Postgresql,选择一个“假”行

    在 Postgres 8 4 或更高版本中 获取默认填充的一行数据的最有效方法是什么没有实际创建行 例如 作为交易 伪代码 create table mytable id serial PRIMARY KEY NOT NULL parent
  • 查找具有唯一两列组合的所有行

    我有这张桌子messages sender id recipient id 1 2 1 3 1 3 2 1 3 1 2 3 我希望选择这样的行 Either sender id or receiver id current user id