Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL内部联接和分组_Sql_Sql Server_Inner Join - Fatal编程技术网

SQL内部联接和分组

SQL内部联接和分组,sql,sql-server,inner-join,Sql,Sql Server,Inner Join,我已经有一段时间没有使用SQL了,但我有一个相当紧迫的问题 我的数据库布局如下: 现在,从一个Users.ID开始,我想获得用户玩过的所有回合。用户可以是Hosts.HostID,Host.GuestID,甚至两者都可以。如果他两者都是,则结果中不应显示op 我需要的查询结果是Hosts.Name和Rounds的所有字段。一般来说,我想做的是显示一个列表,列出用户作为主持人或嘉宾参与的所有主持人(实际上这些都是游戏),以及可能的总分。单击此按钮时,会出现一些下拉列表,显示各个回合的分数、单词等

我已经有一段时间没有使用SQL了,但我有一个相当紧迫的问题

我的数据库布局如下:

现在,从一个
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
的结果。