0

特定の複数のタグを持つ投稿の post_ID とサムネイルを取得したい。私のテーブルは次のとおりです。

table: post
-------------------
post_ID | thumbnail
1       | 1.jpg
2       | 2.jpg
3       | 3.jpg
4       | 4.jpg
5       | 5.jpg

table: tags
-----------
tag_ID | tag
1      | red
2      | yellow
3      | orange
4      | blue
5      | pink

table: post_tags
----------------
post_ID | tag_ID
1       | 1
1       | 2
1       | 4
1       | 5
2       | 2
2       | 3
3       | 4
3       | 1
3       | 2
4       | 5
4       | 4
5       | 1
5       | 3
5       | 5

私は現在、このようなものを使用していますが、機能していません。最初に配列内の投稿のすべてのタグを取得し、それらを比較して、投稿に言及された 3 つのタグがすべて含まれているかどうかを確認します。

 SELECT post_ID FROM post_tags 
 WHERE tag_ID IN ($thisTags[0], $thisTags[1], $thisTags[2], $thisTags[3])

参加またはグループ化する必要がありますか? 私はSQLとPHPが初めてです。どうもありがとう。

4

3 に答える 3

0

これは、「set-within-sets」サブクエリの例です。最大限の柔軟性を得るためにgroup by、 andを使用することをお勧めします。havingアイデアは、ロジックをhaving句に移動することです。あなたの場合、これは次のようになります。

SELECT post_ID
FROM post_tags 
group by post_id
having sum(tag_id = $thisTags[0]) > 0 and
       sum(tag_id = $thisTags[1]) > 0 and
       sum(tag_id = $thisTags[2]) > 0 and
       sum(tag_id = $thisTags[3]) > 0;

これらのタグのみが必要で、他のタグが不要な場合:

SELECT post_ID
FROM post_tags 
group by post_id
having sum(tag_id = $thisTags[0]) > 0 and
       sum(tag_id = $thisTags[1]) > 0 and
       sum(tag_id = $thisTags[2]) > 0 and
       sum(tag_id = $thisTags[3]) > 0 and
       count(distinct tag_id) = 4;

これら 4 つのタグのうち少なくとも 3 つが必要な場合:

SELECT post_ID
FROM post_tags 
group by post_id
having (max(tag_id = $thisTags[0]) + and
        max(tag_id = $thisTags[1]) + and
        max(tag_id = $thisTags[2]) + and
        max(tag_id = $thisTags[3])
       ) >= 3;
于 2013-07-17T21:26:16.487 に答える
0

post_tags(post_ID,tag_ID) に UNIQUE 制約があり、thisTags の要素が一意であることを確認できる場合は、次のようにすることができます。

SELECT post_ID FROM post_tags 
 WHERE tag_ID IN ($thisTags[0], $thisTags[1], $thisTags[2], $thisTags[3])
 GROUP BY post_ID
HAVING COUNT(1) = 4

このアプローチでは、要素$thisTagsが一意であることが必要です。post_tags テーブルの一意性の問題は簡単に回避できます (ただし、上記のクエリではテーブルも一意である必要があります)。

同等の結果を得ることができる他の SQL ステートメント、他のアプローチがありますが、上記のクエリが最も簡潔です。(他のアプローチのいくつかは、EXISTS 述語を使用するか、各タグに対して返される一連の post_ID に対して JOIN 操作を使用することです。)

于 2013-07-17T21:21:06.850 に答える