with arraystyle as (
select article_id, array_agg(tag_id) as tagarray
from articles_tags
group by article_id
)
select * from arraystyle;
article_id | tagarray
------------+-----------
B | {2,4}
A | {1,2}
(2 rows)
with arraystyle as (
select article_id, array_agg(tag_id) as tagarray
from articles_tags
group by article_id
)
select * from arraystyle
where not tagarray @> '{1,3}';
article_id | tagarray
------------+----------
B | {2,4}
A | {1,2}
(2 rows)
with arraystyle as (
select article_id, array_agg(tag_id) as tagarray
from articles_tags
group by article_id
)
select * from arraystyle
where not tagarray @> '{1}';
article_id | tagarray
------------+----------
B | {2,4}
(1 row)
select
distinct article_id
from (
select
t1.id as "article_id",
t2.id as "articles_tags"
from articles t1 cross join tags t2 where t2.id in (3,4)
except
( select
article_id,
tag_id from articles_tags where tag_id in (3,4) ) ) tab
select a.*
from articles a
where not exists (select 1 from article_tags art where art.article_id = a.id and art.tag = 3) or
not exists (select 1 from article_tags art where art.article_id = a.id and art.tag = 4) ;
也可以使用集合操作:
select a.id
from articles a
except
(select art.article_id
from article_tags art
where art.tag = 3
intersect
select art.article_id
from article_tags art
where art.tag = 4
);
4条答案
按热度按时间3vpjnl9f1#
你可以用
not exists
和聚合查询:这是假定在上没有重复项
article_tags(article_id, tag_id)
(如示例数据所示)。您还可以在一个
having
条款:wvmv3b1j2#
我将使用postgresql数组类型来处理这个问题。
忽略
articles
以及tags
要简化的表:使用此格式的tagarray可以使用数组函数和运算符。安全壳操作员之一,
@>
以及<@
,是你所需要的否定形式。ybzsozfc3#
试试这个:
演示
这将在组合的重复条目的情况下处理
zte4gxcn4#
一种方法是
not exists
:也可以使用集合操作: