次のテーブル構造があります。
Tags:
Tag_ID | Name
1 | Tag1
2 | Tag2
3 | Tag3
4 | Tag4
5 | Tag5
6 | Tag6
Posts:
Post_ID | Title | Body
1 | Post1 | Post1
2 | Post2 | Post2
3 | Post3 | Post3
4 | Post4 | Post4
5 | Post5 | Post5
6 | Post6 | Post6
7 | Post7 | Post7
8 | Post8 | Post8
9 | Post9 | Post9
10 | Post10| Post10
TagsPosts:
Tag_ID | Post_ID
1 | 1
1 | 2
1 | 3
1 | 4
1 | 5
1 | 10
1 | 1
2 | 1
2 | 2
2 | 6
2 | 7
3 | 4
3 | 8
3 | 9
4 | 7
5 | 1
5 | 2
5 | 3
5 | 4
5 | 5
5 | 6
5 | 7
6 | 2
クエリから返す必要があるのはPosts
、最も一般的な上位 3つと、重複を提供しない残りのTag
上位 1 つです。Post
Tags
Posts
Desired Output:
Tag_ID | Post_ID
5 | 1
5 | 2
5 | 3
1 | 10
2 | 6
3 | 9
4 | 7
これまでのところPosts
、最も一般的なTag
使用方法のトップ 3 を特定できました。
SELECT Top(3) t.Tag_ID, p.Post_ID FROM Tags as t
INNER JOIN TagsPosts as tp ON t.Tag_ID = tp.Tag_ID
INNER JOIN Posts as p ON tp.Post_ID = p.Post_ID
WHERE t.Tag_ID IN (
SELECT TOP(1) Tag_ID FROM TagsPosts GROUP BY Tag_ID ORDER BY COUNT(Tag_ID) DESC)
Result:
Tag_ID | Post_ID
5 | 1
5 | 2
5 | 3
Post
また、残りのTags
使用についてトップ 1 を特定しました。
SELECT t.Tag_ID, p.Post_ID FROM Tags as t
INNER JOIN (
SELECT t.Tag_ID, Max(p.Post_ID) as Post_ID FROM Tags as t
INNER JOIN TagsPosts as tp ON t.Tag_ID = tp.Tag_ID
INNER JOIN Posts as p ON tp.Post_ID = p.Post_ID
WHERE t.Tag_ID NOT IN (
SELECT TOP(1) Tag_ID FROM TagsPosts GROUP BY Tag_ID ORDER BY COUNT(Tag_ID) DESC)
AND
p.Post_ID NOT IN (
SELECT Top(3) p.Post_ID FROM Tags as t
INNER JOIN TagsPosts as tp ON t.Tag_ID = tp.Tag_ID
INNER JOIN Posts as p ON tp.Post_ID = p.Post_ID
WHERE t.Tag_ID IN (
SELECT TOP(1) Tag_ID FROM TagsPosts GROUP BY Tag_ID ORDER BY COUNT(Tag_ID) DESC))
GROUP BY t.Tag_ID) as s ON t.Tag_ID = s.Tag_ID
INNER JOIN Posts as p ON s.Post_ID = p.Post_ID
Result:
Tag_ID | Post_ID
1 | 10
2 | 7
3 | 9
4 | 7
これでほぼ完了ですが、ご覧のとおり、 duplicate が返されますPosts
。
ちなみに、私はMySQLに不慣れなため、テストにはSQL Server 2008 Expressを使用していますが、MySQLデータベースに適用できるSQLクエリを特定するよう求められています。T-SQL で基本的なクエリを取得できれば、MySQL で使用される SQL に変換するのは非常に簡単になると考えました。