如何在 SQL 中连接多个表和 GROUP BY

Posted

技术标签:

【中文标题】如何在 SQL 中连接多个表和 GROUP BY【英文标题】:How to join multiple tables and GROUP BY in SQL 【发布时间】:2021-12-14 03:15:09 【问题描述】:

我正在尝试为用户收集所有会话(每行一行),然后按日期对行进行分组,以便可以在我的应用程序的前端对数据进行排序。

我能够从四个不同的表中选择和连接列,但我不知道现在如何在输出中使用 GROUP BY。

这行得通:

SELECT session_streams.app_id, session_streams.start_time, session_streams.scenario_fk, session_streams.session_fk, session_streams.stream_fk, scenarios.scenario_name, streams.stream_name
FROM session_streams
JOIN scenarios
ON session_streams.scenario_fk = scenarios.id
JOIN streams
ON session_streams.stream_fk = streams.id
JOIN users
ON users.app_id = session_streams.app_id
WHERE users.email = 'email'
ORDER BY session_streams.start_time DESC

这会导致错误:

SELECT session_streams.app_id, session_streams.start_time, session_streams.scenario_fk, session_streams.session_fk, session_streams.stream_fk, scenarios.scenario_name, streams.stream_name
FROM session_streams
JOIN scenarios
ON session_streams.scenario_fk = scenarios.id
JOIN streams
ON session_streams.stream_fk = streams.id
JOIN users
ON users.app_id = session_streams.app_id
WHERE users.email = 'email'
GROUP BY session_streams.start_time
ORDER BY session_streams.start_time DESC

错误:“列“session_streams.app_id”必须出现在 GROUP BY 子句中或用于聚合函数中”

当我将“必需”列添加到 GROUP BY 子句时,它会要求 SELECT 子句中列出的下一列。在 SELECT 子句中添加所有这些列不会产生不同的结果。

我怎样才能在这个输出中只按一列分组?

【问题讨论】:

您需要提供样本数据和所需的输出,并说明您正在尝试做什么 答案是:你不能。在GROUP BY 查询中(好吧,mysql 除外),SELECT 列表中的每个表达式要么是在 GROUP BY 子句中重新出现的表达式,要么是一个聚合函数:MIN(),MAX(),AVG() ,SUM(),COUNT(),仅列出通常最受欢迎的。 【参考方案1】:

在问题中,您应该阐明您的意图。 SQL 没有清楚地表明意图。话虽如此,请查看此...

请注意您了解它的作用以及ORDER BY 如何影响结果中的哪些行。你可以在 postgresql 中使用DISTINCT ON,像这样。

您可能需要向ORDER BY 添加逻辑以确定每个组中的哪一行在结果中。如果没有问题的更多细节,很难知道。

Fiddle

SELECT DISTINCT ON (session_streams.start_time)
       session_streams.app_id
     , session_streams.start_time
     , session_streams.scenario_fk
     , session_streams.session_fk
     , session_streams.stream_fk
     , scenarios.scenario_name
     , streams.stream_name
  FROM session_streams
  JOIN scenarios
    ON session_streams.scenario_fk = scenarios.id
  JOIN streams
    ON session_streams.stream_fk = streams.id
  JOIN users
    ON users.app_id = session_streams.app_id
 WHERE users.email = 'email'
 ORDER BY session_streams.start_time DESC
;

【讨论】:

以上是关于如何在 SQL 中连接多个表和 GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章

SQL group by 连接查询结果的字符串

sql如何取group by 分组的多条记录只取最上面的一条!

如何在连接多个表时使用 GROUP BY 连接字符串?

如何在没有附加查询的情况下在 SQL Server 中连接没有子查询的 GROUP BY 子句中的字符串?

ElasticsearchElasticsearch如何实现 SQL语句中 Group By 和 Limit 的功能

sql中得group by 用法?