首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多列的主键选择行

问使用多列的主键选择行
EN

Stack Overflow用户
提问于 2020-01-03 17:06:53
回答 2查看 1.9K关注 0票数 0

如何根据所提供的配对列表选择所有相关记录?

表:

代码语言:javascript
复制
CREATE TABLE "users_groups" (
    "user_id" INTEGER NOT NULL,
    "group_id" BIGINT NOT NULL,
    PRIMARY KEY (user_id, group_id),
    "permissions" VARCHAR(255)
);

例如,如果我有下面的对的JavaScript array,那么我应该从DB获得

代码语言:javascript
复制
[
  {user_id: 1, group_id: 19},
  {user_id: 1, group_id: 11},
  {user_id: 5, group_id: 19}
]

在这里,我们看到相同的user_id可以在多个组中。

我可以通过每个数组元素传递for-loop,并创建以下查询

代码语言:javascript
复制
SELECT * FROM users_groups
    WHERE (user_id = 1 AND group_id = 19) 
    OR (user_id = 1 AND group_id = 11) 
    OR (user_id = 5 AND group_id = 19);

但这是最好的解决办法吗?假设数组很长。如我所知,查询长度可以得到~1GB。

做这件事的最好和快速的解决方案是什么?

EN

回答 2

Stack Overflow用户

发布于 2020-01-03 18:09:24

比尔·卡温的回答也同样适用于波斯特格斯。

但是,我的经验是,与VALUES子句的连接通常比大型IN list更快(包含数百个元素(如果不是数千个元素):

代码语言:javascript
复制
select ug.*
from user_groups ug
  join ( 
     values (1,19), (1,11), (5,19), ... 
  ) as l(uid, guid) on l.uid = ug.user_id and l.guid = ug.group_id;

这假设在所提供的值中没有重复项,否则联接将导致重复行,而in解决方案则不会这样做。

票数 2
EN

Stack Overflow用户

发布于 2020-01-03 17:19:06

您标记了mysql和postgresql,所以我不知道您真正使用的是哪个SQL数据库。

MySQL至少支持元组比较:

代码语言:javascript
复制
SELECT * FROM users_groups WHERE (user_id, group_id) IN ((1,19), (1,11), (5,19), ...)

这类谓词可以在MySQL 5.7及更高版本中进行优化。请参阅https://dev.mysql.com/doc/refman/5.7/en/range-optimization.html#row-constructor-range-optimization

我不知道PostgreSQL是否支持这种类型的谓词,或者它是否对其进行了优化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59582539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档