如何在 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 Server 中连接没有子查询的 GROUP BY 子句中的字符串?