2013-07-02 1 views
0

Привет, я пытаюсь вставить это в инструкцию doctrine2, к сожалению, у меня есть узел в моем мозгу прямо сейчас.Выберите из ManyToMany только в том случае, если применяются все идентификаторы

У меня есть 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, и это касается моей проблемы. Я хочу выбрать только post_id из таблицы m2n, если применяются все идентификаторы. И я немного глуп, потому что все мои аттестаты либо дают мне оба входа, либо нет.

Если вы можете дать мне SQL я буду хорошо, если вы можете дать мне DQL это будет удивительно

E: уточнение Так суммировать вещи:

Я использую л например $ object-> filterPostsByTag (массив (1,2)); теперь я хочу только те сообщения, где по крайней мере назначаются теги с идентификатором 1 И 2. Мои попытки с присоединениями приводили к возврату обоих сообщений или никому.

ответ

1

Если вы хотите, чтобы все идентификаторы (предположительно «помечать» идентификаторы) для применения, а затем использовать агрегацию с 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) 

EDIT: (После того, как ОП был пересмотрен)

Если вы только хотите два конкретных тегов, вы можете использовать ту же идею:

Если вы хотите, чтобы все идентификаторы (предположительно «помечать» идентификаторы) для применения, а затем использовать агрегацию с 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 
+0

пытается и перепроверять – Soundz

+0

да SQL, работает, теперь пришло время учить этому doctrine2, их синтаксический анализатор откусил ему кажется – Soundz