如何使用 Joins 和 Group by 编写查询
How to write query using Joins and Group by
我有一个 SQL 服务器数据库,我在其中存储推文及其关系。
我有以下 tables:
- tweets(具有 tweets 属性,例如其 id)
- users(具有用户属性,例如其 ID)
- hashtags(存储提到的主题标签。它有一个 id 和 hashtag 列,用于存储主题标签字符串)
- searches(这存储了我感兴趣的搜索,例如,如果我想搜索谈论“汽车”的推文,则搜索 table有一行 search_id 和 search_word,这将是“汽车”)。
我使用两个一对多关系 table 连接那些(searches_tweets 和 hashtags_tweets),连接每个table的id。这些是它们之间的联系:
- 搜索 - searches_tweets - 推文(searches_tweets 有 2 列:search_id 和 tweet_id)
- 主题标签 - hashtags_tweets - 推文(hashtags_tweets 有 2 列:hashtag_id 和 tweet_id)
首先,我想执行以下查询:我想检索在某个搜索的推文中提及某个主题标签的次数。我通过这样做实现了这一目标:
SELECT TOP(100) hashtags.id, hashtags.hashtag, count(tweets.id) AS total_count FROM hashtags
JOIN hashtags_tweets ON hashtags_tweets.hashtag_id = hashtags.id
JOIN tweets ON tweets.id = hashtags_tweets.tweet_id
JOIN searches_tweets ON searches_tweets.tweet_id = tweets.id
WHERE searches_tweets.search_id = 1234
GROUP BY hashtags.id, hashtags.hashtag
ORDER BY total_count DESC
现在,我想添加一个列,显示在他们的推文中写下这个主题标签的用户数量(来自同一个 search_id)。我找不到办法做到这一点。我尝试了以下查询:
SELECT TOP(100) hashtags.id, hashtags.hashtag, count(tweets.id) AS total_count, count(users.id) AS users_count
FROM hashtags
JOIN hashtags_tweets ON hashtags_tweets.hashtag_id = hashtags.id
JOIN tweets ON tweets.id = hashtags_tweets.tweet_id
JOIN searches_tweets ON searches_tweets.tweet_id = tweets.id
JOIN users ON tweets.user_id = users.id
WHERE searches_tweets.search_id = 1234
GROUP BY hashtags.id, hashtags.hashtag, users.id
ORDER BY total_count DESC
此查询无效,因为 users_count
与 total_count
具有相同的值。您将如何实现这一预期结果?
对于您应该使用的不同数量的用户
SELECT TOP(100) hashtags.id, hashtags.hashtag, count(tweets.id) AS total_count,
count(distinct users.id) AS users_count
FROM hashtags
......
GROUP BY hashtags.id, hashtags.hashtag
显然..您必须从 group by 子句中删除 users.id..
我有一个 SQL 服务器数据库,我在其中存储推文及其关系。
我有以下 tables:
- tweets(具有 tweets 属性,例如其 id)
- users(具有用户属性,例如其 ID)
- hashtags(存储提到的主题标签。它有一个 id 和 hashtag 列,用于存储主题标签字符串)
- searches(这存储了我感兴趣的搜索,例如,如果我想搜索谈论“汽车”的推文,则搜索 table有一行 search_id 和 search_word,这将是“汽车”)。
我使用两个一对多关系 table 连接那些(searches_tweets 和 hashtags_tweets),连接每个table的id。这些是它们之间的联系:
- 搜索 - searches_tweets - 推文(searches_tweets 有 2 列:search_id 和 tweet_id)
- 主题标签 - hashtags_tweets - 推文(hashtags_tweets 有 2 列:hashtag_id 和 tweet_id)
首先,我想执行以下查询:我想检索在某个搜索的推文中提及某个主题标签的次数。我通过这样做实现了这一目标:
SELECT TOP(100) hashtags.id, hashtags.hashtag, count(tweets.id) AS total_count FROM hashtags
JOIN hashtags_tweets ON hashtags_tweets.hashtag_id = hashtags.id
JOIN tweets ON tweets.id = hashtags_tweets.tweet_id
JOIN searches_tweets ON searches_tweets.tweet_id = tweets.id
WHERE searches_tweets.search_id = 1234
GROUP BY hashtags.id, hashtags.hashtag
ORDER BY total_count DESC
现在,我想添加一个列,显示在他们的推文中写下这个主题标签的用户数量(来自同一个 search_id)。我找不到办法做到这一点。我尝试了以下查询:
SELECT TOP(100) hashtags.id, hashtags.hashtag, count(tweets.id) AS total_count, count(users.id) AS users_count
FROM hashtags
JOIN hashtags_tweets ON hashtags_tweets.hashtag_id = hashtags.id
JOIN tweets ON tweets.id = hashtags_tweets.tweet_id
JOIN searches_tweets ON searches_tweets.tweet_id = tweets.id
JOIN users ON tweets.user_id = users.id
WHERE searches_tweets.search_id = 1234
GROUP BY hashtags.id, hashtags.hashtag, users.id
ORDER BY total_count DESC
此查询无效,因为 users_count
与 total_count
具有相同的值。您将如何实现这一预期结果?
对于您应该使用的不同数量的用户
SELECT TOP(100) hashtags.id, hashtags.hashtag, count(tweets.id) AS total_count,
count(distinct users.id) AS users_count
FROM hashtags
......
GROUP BY hashtags.id, hashtags.hashtag
显然..您必须从 group by 子句中删除 users.id..