2013-08-30 58 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 

這裏有個例子我的查詢應該返回後(從後表)衛生組織的ID是6,觀看6的例子POST_ID已經TAG_ID 1 AND TAG_ID 2 NOT ONLY他們中的一員,但在同一時間。如果你想看到從posts的實際信息,剛剛加入該表中

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

EDIT(有點的解釋):

+2

「我試過不同的連接,但沒有成功。」......你能分享你的失敗加入! –

回答

2

你可以用聚集做到這一點。

您有一個「set-set-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

它不工作,沒有結果被返回,我需要的是來自郵件列表的結果(同時具有tags_ids 1和2的帖子列表 –

+0

@MoksyMosky ...。您確定有帖子同時具有兩個標籤嗎? –

+0

是的,我敢肯定,至少有一個職位都有,也是你的查詢不查詢郵政表,但它的查詢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的帖子(在同一時間,不是其中之一) –

+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 - on子句中的列'posts_id'不明確 –

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

這兩個請求都不起作用, ives與tag_id帖子1或2我需要的是帖子與tag_id 1和2(在同一時間) –