如何使用Joins和Group by编写查询



我有一个SQL Server数据库,用于存储tweet及其关系。

我有以下表格:

  • tweets(具有tweets属性,如其id(
  • users(具有用户属性,如其id(
  • hashtags(存储上面提到的hashtags。它有一个id和hashtag列,存储hashtag字符串(
  • 搜索(这存储了我感兴趣的搜索,例如,如果我想搜索谈论"汽车"的推文,搜索表中有一行带有search_id和search_word,即"汽车"(

我使用两个一对多关系表(searches_tweetshashtags_tweets(连接这些表,连接每个表的id。这些是它们之间的联系:

  • 搜索-搜索推特-推特(搜索推特有两列:search_id和tweet_id(
  • hashtags-hashtags_tweets-tweets(hashtags_twitter有两列: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

显然。。必须从broup by子句中删除users.id。。

最新更新