2013-08-30 3 views
0

У меня есть таблица posts и таблица post_tags Вот мой пост структура таблицы Пример:MySQL Выберите строки с эксклюзивным И

post_id  int(11) 
post_user int(11) 
post_title text 
post_content longtext 

и это моя post_tags структура пример:

post_id int(11) 
tag_id int(11) 

Мне нужно выбрать все записи из таблицы posts, которые имеют tag_id 1 и 2 одновременно, я пробовал разные объединения без успеха.

пример данных post_tags таблицы:

post_id tag_id 
1  1 
2  1 
5  2 
6  1 
6  2 

ЗДЕСЬ, например мой запрос должен возвращать запись (из почтовой таблицы) чей идентификатор 6, смотрите в примере POST_ID 6 имеет tag_id 1 И tag_id 2 НЕ ТОЛЬКО ОДИН ИЗ ИХ, но ОБА в то же время.

+2

«Я пробовал разные объединения без успеха». ... Не могли бы вы поделиться своими неудачами? !!!! –

ответ

2

Вы можете сделать это с помощью агрегирования:

select post_id 
from post_tags pt 
group by post_id 
having sum(tag_id = 1) > 0 and 
     sum(tag_id = 2) > 0; 

Если вы хотите увидеть фактическую информацию из posts, просто присоединиться к этой таблице в

EDIT (немного объяснения):.

У вас есть запрос «set-in-sets». Это общий запрос, и я предпочитаю его решать с помощью агрегации и предложения having, потому что это наиболее общий подход.

Каждое условие в предложении having подсчитывает количество строк, соответствующих одному из тегов. То есть sum(tag_id = 1) подсчитывает строки в post_tags, где это верно. Условие > 0 просто говорит: «tag_id = 1 существует хотя бы на одну строку».

Причина, по которой мне нравится этот подход, заключается в том, что вы можете легко обобщить его. Если вы хотите использовать теги 3 и 4:

having sum(tag_id = 1) > 0 and 
     sum(tag_id = 2) > 0 and 
     sum(tag_id = 3) > 0 and 
     sum(tag_id = 4) > 0; 

И так далее.

+0

он не работает, результат не возвращен, мне нужны результаты из таблицы сообщений (список сообщений, которые имеют теги_ID 1 И 2 ​​одновременно –

+0

@MoksyMosky ... .Вы уверены, что есть сообщения, которые имеют обе метки? –

+0

Да, я уверен, что хотя бы одно сообщение имеет оба, а также ваш запрос не запрашивает столбец post, но он запрашивает таблицу post_tags –

0

Дайте это попробовать:

SELECT post.* 
FROM (SELECT T1.post_id 
     FROM (SELECT * FROM post_tags WHERE 1 IN(tag_id)) T1 
     INNER JOIN (SELECT * FROM post_tags WHERE 2 IN(tag_id)) T2 ON T1.post_id = T2.post_id) 
     T3 
INNER JOIN post ON T3.post_id=post.post_id; 

SQL Скрипки Ссылка: http://sqlfiddle.com/#!2/04f74/33

+0

Этот запрос дает сообщения с tag_id 1 ИЛИ 2, что мне нужно это сообщения с tag_id 1 AND 2 (во время samer, а не только одно из них) –

+0

Можете ли вы привести несколько примеров того, как выглядят данные в поле tag_id? – tigeravatar

+0

Отредактировал мой вопрос с данными примера –

0

Это должно работать

select q.* from (
     select p.post_id as post_id from post_tags p 
     where p.tag_id=1 
     and exists (
      select 1 from post_tags p2 
      where p2.post_id=p.post_id 
      and p2.tag_id=2) 
    ) as t 
    inner join posts q on posts_id=t.post_id; 
+0

ошибка # 1052 - столбец 'posts_id' in on задается неоднозначно –

0
select a.post_id, b.post_id, a.post_user, b.post_tags 
from posts as a 
inner join post_tags as b 
where b.post_tags in(1, 2) 

или

select a.post_id, b.post_id, a.post_user, b.post_tags 
from posts as a 
inner join post_tags as b 
where b.post_tags =1 or b.post_tags = 2 
+0

Оба запроса не работают, оба g ives с tag_id 1 ИЛИ 2 Мне нужны сообщения с tag_id 1 AND 2 (в то же время) –

Смежные вопросы