如何编写SQL查询筛选同时包含指定多标签的记录ID
筛选同时拥有指定标签的车辆ID的通用SQL写法
现有cars和car_tags两张关联表,要找出同时带指定标签(比如标签3和4)的车辆ID,还要让SQL能适配任意数量的标签筛选。你之前写的聚合标签的查询可以改造一下,或者用更高效的分组筛选方案:
高效通用方案(推荐)
SELECT cars.id FROM "cars" INNER JOIN "car_tags" ON "car_tags"."car_id" = "cars"."id" WHERE car_tags.tag_id IN (3, 4) -- 这里换成你要的标签列表,比如(3,4,5) GROUP BY cars.id HAVING COUNT(DISTINCT car_tags.tag_id) = 2; -- 数字要和标签数量一致,比如3
用法很直白:要筛几个标签,就把IN里的列表换成对应的标签ID,后面的数字改成标签的总数就行。加DISTINCT是防止同一辆车重复关联同一个标签,导致计数不准。
基于你原查询的改造版
如果想保留聚合标签的输出,同时筛选符合条件的记录,可以这么改:
SELECT cars.id, array_agg(car_tags.tag_id) AS tag_ids FROM "cars" INNER JOIN "car_tags" ON "car_tags"."car_id" = "cars"."id" GROUP BY cars.id HAVING array_agg(car_tags.tag_id) @> ARRAY[3, 4]::INT[]; -- 换成你要的标签数组,比如ARRAY[3,4,5]
这个用了PostgreSQL的数组包含判断,只要聚合后的标签数组包含所有指定标签,就会被筛选出来,同样支持任意数量的标签。
内容的提问来源于stack exchange,提问作者pppp
相关产品推荐
相关产品推荐

