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

Posted

技术标签:

【中文标题】如何使用 Joins 和 Group by 编写查询【英文标题】:How to write query using Joins and Group by 【发布时间】:2021-12-30 06:06:22 【问题描述】:

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

我有以下表格:

tweets(具有 tweet 属性,例如其 id) users(具有用户属性,例如其 id) hashtags(存储提到的hashtags。它有一个id 和hashtag 列,用于存储hashtag 字符串) searches(这存储了我感兴趣的搜索,例如,如果我想搜索谈论“汽车”的推文,搜索表有一行带有 search_id 和 search_word,这将是“汽车”)。

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

搜索 - searchs_tweets - 推文(searches_tweets 有 2 列:search_id 和 tweet_id) hashtags - hashtags_tweets - 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_counttotal_count 具有相同的值。您将如何实现这一预期结果?

【问题讨论】:

如果我没听错的话,count(DISTINCT users.id)。并从GROUP BY中删除users.id 【参考方案1】:

对于您应该使用的不同用户数

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..

【讨论】:

是的,正如@HoneyBadger 所说,还需要从 GROUP BY 中删除 users.id @MarkJohnson 很明显 .. 无论如何,答案已更新为正确的 group by

以上是关于如何使用 Joins 和 Group by 编写查询的主要内容,如果未能解决你的问题,请参考以下文章

通过 group by 和 joins 获取多个表的多个列的总和

MySQL 使用 GROUP_CONCAT 和多个 JOINS

如何在 Oracle 中编写长 group by/case 子句?

sql查询中如何用group by查询出完整的一行记录?

如何在 T-SQL 中使用 group by 和 union

Rails/MySQL:使用 LEFT JOINS 的 Group/Distinct 使查询时间加倍/性能降低