1

私は3つのテーブルを持っています

   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ます。これにより、これらの特定のタグの少なくとも 1 つにリンクされているメッセージが表示されます。

更新: 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は非接合集合の交差を表すため、空の集合を表します。

むしろ、このセットの結合が必要です。ANDをに置き換えるだけORです。

于 2012-08-01T15:48:16.547 に答える