仅在适用所有ID时从ManyToMany中选择

时间:2013-07-02 02:04:55

标签: mysql sql doctrine-orm dql

嗨,我正试图将其变成一个学说2,不幸的是,我现在已经在脑子里打结了。

我有3张桌子

post

id | unrelated stuff

post_has_tag

post_id | tag_id
1         1
1         2
2         2

tag

 id | name
 1    smth
 2    smthelse

现在我想使用一些标签导航,有点像stackoverflow,这是我的问题适用的地方。如果所有ID都适用,我想从我的m2n表中只选择post_id。而且我在这里有点愚蠢,因为我的所有人都给了我既得托管也没有托付。

如果你能给我sql我会没事的,如果你能给我dql那就太棒了

E:澄清 总而言之:

我使用像$ object-> filterPostsByTag(array(1,2))的smth;现在我只想要至少分配id为1和2的标签的帖子。我对连接的尝试导致返回两个帖子或没有。

1 个答案:

答案 0 :(得分:1)

如果您希望应用所有ID(可能是“标记”ID),则使用带有having子句的聚合:

select pht.post_id
from post_has_tag pht
group by pht.post_id
having count(distinct pht.tag_id) = (select count(distinct t.tag_id) from tag t)

编辑:( OP修订后)

如果您只想要两个特定标签,则可以使用相同的想法:

如果您希望应用所有ID(可能是“标记”ID),则使用带有having子句的聚合:

select pht.post_id
from post_has_tag pht
group by pht.post_id
having max(pht.tag_id = 1) > 0 and
       max(pht.tag_id = 2) > 0

这将返回包含两个标记的所有帖子。如果你想要其他标签

select pht.post_id
from post_has_tag pht
group by pht.post_id
having max(pht.tag_id = 1) > 0 and
       max((pht.tag_id <> 1) or (pht.tag_id <> 2)) = 0