我有一个带有数据的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个不同的Ts怎么办?我这样做了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)
的指数将加快这一速度。
这是你想要的? (这是在mysql中完成的,但是你问的是一个标准的SQL问题)。
select t.idx, t.name
from test t INNER JOIN test t2
on t.name = t2.name
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])