1

我有三张桌子

   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 行

4

3 回答 3

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而不是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
于 2012-08-01T15:47:46.083 回答
3

不会检索行,因为您的条件无效。它总是会导致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
于 2012-08-01T15:46:47.173 回答
1

该条件message_tag.tag_id =191 AND message_tag.tag_id =19 AND message_tag.tag_id =31表示离散集的交集,因此它表示一个空集。

你需要的是这个集合的联合。只需将 替换ANDOR

于 2012-08-01T15:48:16.547 回答