2016-01-30 3 views
-1

Прошу прощения за неопределенное название, но я действительно не могу сделать это более конкретным с моим английским.Mysql select complex query

У меня есть эта таблица называется posts__tags, что я использую, чтобы связать post ids и tag ids со следующими столбцами

record_id, post_id и tag_id. Ниже приведен пример выборки

record_id | post_id | tag_id 
1   | 1 | 1  
2   | 1 | 2  
3   | 1 | 3  
4   | 2 | 2  
5   | 3 | 1  
6   | 3 | 3  
7   | 4 | 2  
8   | 4 | 3  
9   | 4 | 4 

У меня есть функция PHP, которая имеет массив tag_ids в качестве параметра. Скажем, например, что мой параметр - array(2,3). Мне нужно выбрать все post_id, которые связаны с tag_id = 2 AND tag_id = 3.

В приведенном выше примере я должен получить 1 и 4 post_id, так как только те, которые связаны как с тегами, так и с тегами 2 и 3.

Каков наилучший способ достичь этого с помощью запроса MySQL?

Заранее спасибо

+0

Обратите внимание, что запись, по-видимому избыточны. На остальных столбцах может быть сформирован вполне исправный PK. – Strawberry

+0

record_id используется в разных запросах, просто не в этом, но спасибо за точку! –

+0

Вы уверены? Это кажется маловероятным. – Strawberry

ответ

1
select post_id from posts__tags where tag_id in (1,2) group by post_id having count(*)=2 
+0

Спасибо, что это работает, только вопрос, я полагаю, count (*) = X, где X - длина массива tag_ids справа? –

+0

Да, вы правы – splash58

1

Попробуйте

select distinct post_id from table_name where tag_id in (2,3) 
+0

По какой-то причине он возвращает все записи, которые имеют post_id, связанный с tag_id = 2 ИЛИ tag_id = 3. Мне нужны те, которые связаны с этими Идами. –

+0

пришлите мне свой запрос sql – Athi

+0

Группа by post_id имеет счет (*) = 2 [здесь не требуется никаких различий] – Strawberry