在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想要的消息都有这三个标签。