簡體   English   中英

在mysql中合並兩個表

[英]Combine two tables in 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

我想隨機選擇與標簽191、19和31連接的20行

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代替AND 這將為您帶來至少鏈接到那些特定標簽之一的消息。

更新: 如果要獲取所有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

由於您的條件無效,因此不會檢索行。 它總是會導致false tag_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

使用IN子句代替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

條件message_tag.tag_id =191 AND message_tag.tag_id =19 AND message_tag.tag_id =31表示脫離的集合的交集,因此它表示一個空集合。

您需要將此集合的並集。 只需將AND替換為OR

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM