SQL内部联接和分组
我已经有一段时间没有使用SQL了,但我有一个相当紧迫的问题 我的数据库布局如下: 现在,从一个SQL内部联接和分组,sql,sql-server,inner-join,Sql,Sql Server,Inner Join,我已经有一段时间没有使用SQL了,但我有一个相当紧迫的问题 我的数据库布局如下: 现在,从一个Users.ID开始,我想获得用户玩过的所有回合。用户可以是Hosts.HostID,Host.GuestID,甚至两者都可以。如果他两者都是,则结果中不应显示op 我需要的查询结果是Hosts.Name和Rounds的所有字段。一般来说,我想做的是显示一个列表,列出用户作为主持人或嘉宾参与的所有主持人(实际上这些都是游戏),以及可能的总分。单击此按钮时,会出现一些下拉列表,显示各个回合的分数、单词等
Users.ID
开始,我想获得用户玩过的所有回合。用户可以是Hosts.HostID
,Host.GuestID
,甚至两者都可以。如果他两者都是,则结果中不应显示op
我需要的查询结果是Hosts.Name
和Rounds
的所有字段。一般来说,我想做的是显示一个列表,列出用户作为主持人或嘉宾参与的所有主持人(实际上这些都是游戏),以及可能的总分。单击此按钮时,会出现一些下拉列表,显示各个回合的分数、单词等
现在我想知道这在一个查询中是否可行。当然,我可以查询所有主机
,然后按主机
查询每轮
,但这似乎没有那么有效。这就是我到目前为止的想法:
SELECT Rounds.ID, Rounds.GameID, Rounds.Round, Rounds.Score, Rounds.Word
, Hosts.ID, Hosts.HostID, Hosts.GuestID
FROM Rounds INNER JOIN Hosts
ON Rounds.GameID = Hosts.ID
INNER JOIN Users
ON Hosts.hostID = Users.ID
WHERE Users.ID = 5
但是,问题是它没有过滤出用户同时是主机和来宾的位置,而且我似乎也无法按Hosts.ID
对其进行分组。将Hosts.hostID Hosts.guestID添加到where子句。如果您使用的是SQL Server 2005或更高版本,您可以这样修改当前查询:
SELECT Rounds.ID, Rounds.GameID, Rounds.Round, Rounds.Score, Rounds.Word
, Hosts.ID, Hosts.HostID, Hosts.GuestID
FROM Rounds INNER JOIN Hosts
ON Rounds.GameID = Hosts.ID
CROSS APPLY
(
SELECT Hosts.HostID
UNION
SELECT Hosts.GuestID
) AS u (UserID)
WHERE u.UserID = 5
;
SELECT Hosts.ID,
TotalScore = SUM(Rounds.Score)
FROM
...
GROUP BY
Hosts.ID
;
那么这将实现什么呢?这不是简单地排除既是主机又是来宾的用户吗?不,这将排除用户既是主机又是来宾的主机。是的,主机,这就是我的意思,对不起。然而,主要的一点是,它将完全排除那些
主机
行,而OP似乎想要选择它们,只是当它们引用相同的用户时,不会重复主机ID
和GuestID
的结果。