选择...在同一表上的t1.tag ='bob'AND t2.tag ='foo'AND t1.idx = t2.idx

时间:2019-04-01 20:55:20

标签: postgresql relational-division

我有一个带数据的postgres表(idx int,标记varchar)

1 T1
1 T2
1 T4
2 T2
2 T3
2 T4
3 T1
3 T4
....

我想做一个查询,如果T1和T2都匹配则返回结果。 BUt我想要可变数量的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的返回列表。

3 个答案:

答案 0 :(得分:1)

您可以使用聚合来实现:

select idx
from tags
where tag in ('T1', 'T2')
group by idx
having count(distinct tag) = 2;

请注意,上面的代码还将返回带有其他标签的值。因此,以上代码会返回至少具有这两个标签的标签。

如果需要五个标签,请扩展IN列表并调整count()的条件以匹配IN列表中的元素数量。

tags (tag, idx)上的索引可以加快速度。

答案 1 :(得分:0)

这是您要找的东西吗? (这是在mysql中完成的,但是您在问一个标准的SQL问题)。

select t.idx, t.name
from test t INNER JOIN test t2
         on t.name = t2.name

答案 2 :(得分:0)

a_horse_with_no_name回答了SQL问题Thanx。 JavaScript代码是

 const seltag = "SELECT idx FROM tags WHERE tag = ANY($1) GROUP BY idx having count(distinct tag) = $2"
 let tags = JSON.parse(args[0]).split(',').map((itm) => itm.trim())
 pool.query(seltag, [tags, tags.length])