postgresql - SELECT ... WHERE t1.tag = 'bob' AND t2.tag = 'foo' AND t1.idx = t2.idx 在同一张桌子上
问题描述
我有一个包含数据的 postgres 表(idx int,tag varchar)
1 T1
1 T2
1 T4
2 T2
2 T3
2 T4
3 T1
3 T4
....
如果 T1 和 T2 都匹配,我想查询返回结果。但是我想要一个可变数量的 T 来匹配。
我可以在运行时根据 args 的数量创建 SQL,但我可以只使用 SQL 来执行此操作吗?
我努力了
SELECT t1.idx, t1.tag, t2.tag, t3.tag from tags t1, tags t2, tags t3 WHERE t1.idx = t2.idx AND t1.tag = 'T1' AND t2.tag = 'T2' AND t1.idx = t3.idx AND t3.tag = 'T3';
这行得通。但是,如果我有 2 或 5 个不同的 T 怎么办。我这样做5次吗?
想要一个与搜索匹配的所有 idx 的返回列表。
解决方案
您可以使用聚合来做到这一点:
select idx
from tags
where tag in ('T1', 'T2')
group by idx
having count(distinct tag) = 2;
请注意,上述内容还将返回具有附加标签的值。所以上面返回那些,至少有这两个标签。
如果您需要五个标签,请扩展IN
列表并调整条件count()
以匹配IN
列表中的元素数量。
上的索引tags (tag, idx)
将加快这一进程。
推荐阅读
- html - 使用作为道具传递的样式类从父类修改子类
- java - 如何在 docker 中为 Java 应用程序添加许多 SSL 证书?
- python - 4D 阵列中的快速线性回归
- objective-c - 我能否使用 crypto_box_seal_open 解密我自己的消息?
- php - 用php将PDF表格解析成csv
- vim - 从可视模式执行命令并返回仍处于可视模式的解决方案
- laravel - 想创建这样的路由但无法在控制器中找到确切的参数值?
- excel - 用于在文件夹内打印文件的 Vba 代码
- vhdl - 使用过程的 VHDL 锁存器推断
- python-3.x - 如何从字符串变量中获取现有的熊猫数据框?