在mysql中合并两个表

在mysql中合并两个表,mysql,sql,Mysql,Sql,我有三张桌子 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)

我有三张桌子

   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行,因为您的条件无效,所以它不会检索行。它总是会导致错误。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

它不会检索行,因为您的条件无效。它总是会导致错误。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

用IN代替AND。这将为您带来链接到至少一个特定标记的消息

更新:如果您想获取所有3个标记都存在的消息,您可以假设message_标记中的行是唯一的:

    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
用IN代替AND。这将为您带来链接到至少一个特定标记的消息

更新:如果您想获取所有3个标记都存在的消息,您可以假设message_标记中的行是唯一的:

    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

条件message_tag.tag_id=191、message_tag.tag_id=19和message_tag.tag_id=31表示分离集的交集,因此它表示一个空集


你需要的是这些集合的并集。只需将AND替换为OR。

条件消息\u tag.tag\u id=191、消息\u tag.tag\u id=19和消息\u tag.tag\u id=31表示分离集的交集,因此它表示空集


你需要的是这些集合的并集。只需将AND替换为OR。

它如何在一个int字段中获取所有3个标记的任何记录?message_tag.tag_id=191和message_tag.tag_id=19和message_tag.tag_id=31?我猜你的意思是用‘或’不加?’你需要通过发布一些数据来详细说明一个标记可以有多条消息,一条消息可以有多个标记。所以我想要连接到所有这三个标签的消息。不是一两个。所有这三个。它如何在一个int字段中获取所有3个标记的任何记录?message_tag.tag_id=191和message_tag.tag_id=19和message_tag.tag_id=31?我猜你的意思是用‘或’不加?’你需要通过发布一些数据来详细说明一个标记可以有多条消息,一条消息可以有多个标记。所以我想要连接到所有这三个标签的消息。不是一两个。这将返回包含这三个标记中的一个或多个标记的消息。我想OP想要的信息都有这三个标签。是的,Dems。你是对的。我希望消息连接所有这三个标记。此消息返回具有这三个标记中的一个或多个标记的消息。我想OP想要的信息都有这三个标签。是的,Dems。你是对的。我希望消息连接所有这三个标记。此消息返回具有这三个标记中的一个或多个标记的消息。我认为OP希望消息包含所有这三个标记。这将返回包含一个或多个这三个标记的消息。我认为OP想要的消息都有这三个标签。