2012-08-01 134 views
1

我有三個表合併兩個表在MySQL

table name: tags 
      id (int) 
      tag_name (vharchar)  

    table name: messages 
      id (int) 
      message_title (vharchar) 
      message_content(vharchar) 

    table name: message_tag 
      message_id (int) 
      tag_id (int) 

我曾嘗試這個代碼,但沒有奏效

SELECT messages.message_title, messages.message_content, tags.tag_name 
      FROM messages 
      INNER JOIN message_tag ON messages.id = message_tag.message_id 
      INNER JOIN tags ON tags.id = message_tag.tag_id 
      WHERE message_tag.tag_id =191 
      AND message_tag.tag_id =19 
      AND message_tag.tag_id =31 
      ORDER BY RAND() 
      LIMIT 20 

我要隨機選擇20行這是(返回空)連接到標籤191,19和31

+0

它如何在只有一個'int'字段中獲取所有'3標籤'的記錄? – Kalpesh 2012-08-01 15:46:40

+0

message_tag.tag_id = 191 AND message_tag.tag_id = 19 AND message_tag.tag_id = 31?我想你的意思是使用'或'不是和? '而且'可能最終會沒有任何結果。 – xbb 2012-08-01 15:47:08

+0

您需要通過發佈一些數據來詳細說明 – Kalpesh 2012-08-01 15:47:27

回答

5
SELECT messages.message_title, messages.message_content, tags.tag_name 
     FROM messages 
     INNER JOIN message_tag ON messages.id = message_tag.message_id 
     INNER JOIN tags ON tags.id = message_tag.tag_id 
     WHERE message_tag.tag_id IN (191, 19, 31) 
     ORDER BY RAND() 
     LIMIT 20 

使用IN,而不是ANDIN條款代替。這會爲您帶來至少與這些特定標籤相關聯的消息。

更新:IF你想獲得所有3個標籤都存在的消息,你可以這樣做,而不是(假設中Message_Tag你的行是唯一的):

SELECT messages.message_title, messages.message_content, tags.tag_name 
     FROM messages 
     INNER JOIN message_tag ON messages.id = message_tag.message_id 
     INNER JOIN tags ON tags.id = message_tag.tag_id 
     WHERE message_tag.tag_id IN (191, 19, 31) 
     GROUP BY messages.id 
     HAVING COUNT(messages.id) > 2 
     ORDER BY RAND() 
     LIMIT 20 
+0

這將返回具有一個或多個這三個標記的消息。我*認爲* OP希望那些有*全部三個這些標籤的消息。 – MatBailie 2012-08-01 15:51:22

+0

這不是我讀過的。但我想你可能是對的。 – 2012-08-01 15:57:00

+0

是的。你是對的。我想要連接所有這三個標籤的消息 – Tahtakafa 2012-08-01 16:08:48

3

它會不是檢索行,因爲您的條件無效。它總是會導致到falsetag_id只能有1可能值,不多。試試這個:

SELECT messages.message_title, messages.message_content, tags.tag_name 
FROM messages 
     INNER JOIN message_tag 
       ON messages.id = message_tag.message_id 
     INNER JOIN tags 
       ON tags.id = message_tag.tag_id 
WHERE message_tag.tag_id IN (191, 19, 31) 
ORDER BY RAND() 
LIMIT 20 

使用AND

更新1

SELECT messages.message_title, messages.message_content, tags.tag_name 
FROM messages 
     INNER JOIN message_tag 
       ON messages.id = message_tag.message_id 
     INNER JOIN tags 
       ON tags.id = message_tag.tag_id 
WHERE message_tag.tag_id IN (191, 19, 31) 
GROUP BY messages.message_title 
HAVING COUNT(*) = 3 
ORDER BY RAND() 
LIMIT 20 
+0

這將返回具有一個或多個這三個標記的消息。我*認爲* OP希望那些有*全部三個這些標籤的消息。 – MatBailie 2012-08-01 15:52:00

+0

也許你是對的。無論如何,我只是更新答案。 – 2012-08-01 15:58:50

1

條件message_tag.tag_id =191 AND message_tag.tag_id =19 AND message_tag.tag_id =31代表disjoned集合的交集,所以它代表一個空集合。

你需要這個集合的聯合。只需將AND替換爲OR即可。