我有以下表结构:
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
最常用的前 3 名Tag
:
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
。
顺便说一句,我使用 SQL Server 2008 Express 进行测试,因为我不熟悉 MySQL,但我被要求确定可以应用于 MySQL 数据库的 SQL 查询。我想如果我在 T-SQL 中获得基本查询,那么将其转换为 MySQL 使用的任何 SQL 都会相当简单。