0

投稿のデータベースがあり、それぞれにタグが付いています。これらのテーブルにはPostsTagsそれぞれ と という名前が付けられています。Posts_Tagsまた、これら 2 つのテーブル間の多対多の関係を維持するという 3 番目のテーブルもあります。

これを行うために、投稿とタグ テーブルの両方にid列があります。したがって、私Posts_Tagsのテーブルには、マッピングを格納するためのpostidと列の両方があります。tagid

たとえば、タイトルに「クラス」という単語が含まれるすべての投稿を照会しています。このクエリを使用すると、これを簡単に実行できます。

SELECT * FROM Posts WHERE title LIKE '%{class}%'

ただし、タイトルに「クラス」が含まれているだけでなく、「Java」タグでタグ付けされているすべての投稿を照会したいと考えています。これは、最初に Java タグの ID を取得する 2 つの個別のクエリで行うことができます。

SELECT id FROM Tags WHERE name='Java'

次に、次のように、それを最初のクエリにプラグインできます。

SELECT     Posts.* 
FROM       Posts 
INNER JOIN Posts_Tags 
        ON Posts.id=Posts_Tags.postid 
WHERE      Posts_Tags.tagid='$java_tag_id' 
           AND title LIKE '%{class}%'

ただし、これを単一のクエリで実行できることはわかっていますが、方法がわかりません。結合を 1 つだけ実行する場合でも、結合について多くのことを考える必要があります。同じクエリで複数の結合を実行すると、頭が回転します。この操作を実行するには、クエリをどのように構成すればよいですか?

4

2 に答える 2

2
    SELECT p.* 
      FROM Posts p 
      JOIN Posts_Tags pt
        ON pt.postid = p.id
      JOIN tags t
        ON t.id = pt.tagid
     WHERE t.tag='java'
       AND p.title LIKE '%{class}%';
于 2013-01-09T08:13:18.973 に答える
0
SELECT 
    p.*
FROM posts as p 
INNER JOIN Posts_Tags pt ON pt.post_id = p.id
INNER JOIN  Tags as t ON pt.tags_id = t.id
WHERE   t.tag='java'
AND p.title LIKE '%keyword%';
于 2013-01-09T08:17:01.160 に答える