Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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_Tsql - Fatal编程技术网

壁球联赛结果-SQL查询

壁球联赛结果-SQL查询,sql,tsql,Sql,Tsql,我最近接管了我所在的壁球俱乐部的内部联赛 我希望把这些放在网上,让会员可以根据需要查看和添加结果 联盟结构如下所示,共有6个联盟 甲级联赛 | | John | Mark | Peter | Martin | Paul | |:------:|:----:|:----:|:-----:|:------:|:----:| | John | NULL | 3 | 0 | 1 | 2 | | Mark | 0 | NULL | 1 |

我最近接管了我所在的壁球俱乐部的内部联赛

我希望把这些放在网上,让会员可以根据需要查看和添加结果

联盟结构如下所示,共有6个联盟

甲级联赛

|        | John | Mark | Peter | Martin | Paul |
|:------:|:----:|:----:|:-----:|:------:|:----:|
| John   | NULL |   3  |   0   |    1   |   2  |
| Mark   |   0  | NULL |   1   |    3   |   0  |
| Peter  |   3  |   3  |  NULL |    1   |   3  |
| Martin |   3  |   1  |   3   |  NULL  |   2  |
| Paul   |   3  |   3  |   0   |    3   | NULL |
联赛2

等等

我设计的桌子结构如下

CREATE TABLE [dbo].[Results](
    [ResultId] [int] IDENTITY(1,1) NOT NULL,
    [LeagueId] [int] NOT NULL,
    [Player1Id] [int] NOT NULL,
    [Player2Id] [int] NOT NULL,
    [Player1Result] [int] NULL,
    [Player2Result] [int] NULL) 

CREATE TABLE [dbo].[Players](
    [PlayerId] [int] IDENTITY(1,1) NOT NULL,
    [UserId] [int] NOT NULL,
    [FirstName] [nvarchar](150) NULL,
    [LastName] [nvarchar](150) NULL)

CREATE TABLE [dbo].[Leagues](
    [LeagueId] [int] IDENTITY(1,1) NOT NULL,
    [LeagueName] [nvarchar](50) NULL)
我正在尝试编写一个查询,它在一个查询中提供每个分区的输出,而不是在几个查询中提供输出 有人能帮我查询一下吗

到目前为止,我得到的是

select p.FirstName, p1.player2result, p2.player2result, p3.player2result, p4.player2result
from
    (select player2Result from Results p1 where p.playerId = p1.Player2Id
    union
    select player2Result from Results p2 where p.playerId = p2.Player2Id
    union
    select player2Result from Results p3 where p.playerId = p3.Player2Id
    union
    select player2Result from Results p4 where p.playerId = p4.Player2Id) as opResult
LEFT JOIN Players p on opResult.Player2Result = p.PlayerId
GROUP BY p.FirstName, p1.player2result, p2.player2result, p3.player2result, p4.player2result

这很棘手,因为每个玩家都可以是结果表中的玩家1或玩家2

这种方法可能有效:

--First, make a list of each player and their score against their opponent
WITH res (pID, score, opponentID) AS (
  SELECT res.player1id [pID], res.player1Result [score], res.player2id [opponent]
  FROM results res
  UNION
  SELECT res2.player2id [pID], res2.player2Result [score], res2.player1id [opponent]
  FROM results res2
) 

--Then select one row for each player with all of their scores.
SELECT p.FirstName,
  res1.score [1],
  res2.score [2],
  res3.score [3],
  res4.score [4],
  res5.score [5]
FROM Players p
  LEFT OUTER JOIN res res1 ON p.playerid = res1.pID and res1.opponentID = 1
  LEFT OUTER JOIN res res2 ON p.playerid = res2.pID and res2.opponentID = 2
  LEFT OUTER JOIN res res3 ON p.playerid = res3.pID and res3.opponentID = 3
  LEFT OUTER JOIN res res4 ON p.playerid = res4.pID and res4.opponentID = 4
  LEFT OUTER JOIN res res5 ON p.playerid = res5.pID and res5.opponentID = 5

这种方法的缺点是,如果你的联赛有更多或更少的球员,你可能需要添加或删除代码。如果您需要它是动态的,您可以尝试使用动态轴心,这将增加复杂性。

这里是一个工作示例

这将在您添加新名称等时保持其自身的最新状态,因此无需在每次创建新播放器时编辑SQL

唯一的挫折是球员的名字必须是唯一的

我想你可以在每个联赛中使用这个,但是如果你需要帮助的话,那就问问吧

还要注意,我的测试数据与你的不一样。我只是编造了一些随机数据

  ------------------------------------------
  --Data setup
  ------------------------------------------

  CREATE TABLE [dbo].[Results]
  (
      [ResultId] [int] IDENTITY(1,1) NOT NULL,
      [LeagueId] [int] NOT NULL,
      [Player1Id] [int] NOT NULL,
      [Player2Id] [int] NOT NULL,
      [Player1Result] [int] NULL,
      [Player2Result] [int] NULL
  )

  CREATE TABLE [dbo].[Players]
  (
      [PlayerId] [int] IDENTITY(1,1) NOT NULL,
      [UserId] [int] NOT NULL,
      [FirstName] [nvarchar](150) NULL,
      [LastName] [nvarchar](150) NULL
  )

  CREATE TABLE [dbo].[Leagues]
  (
      [LeagueId] [int] IDENTITY(1,1) NOT NULL,
      [LeagueName] [nvarchar](50) NULL
  )

  INSERT INTO Players (UserId,FirstName)
  VALUES 
      (1,'John'),
      (2,'Mark'),
      (3,'Peter'),
      (4,'Martin'),
      (5,'Paul')

  INSERT INTO Leagues(LeagueName)
  VALUES
      ('League 1'),
      ('League 2')

  INSERT INTO Results(LeagueId,Player1Id,Player2Id,Player1Result,Player2Result)
  VALUES
      (1,1,2,3,0),
      (1,1,3,0,4),
      (1,1,4,1,2),
      (1,1,5,2,1),
      (1,2,3,1,4),
      (1,2,4,3,2),
      (1,2,5,0,1),
      (1,3,4,1,2),
      (1,3,5,3,1),
      (1,4,5,2,1)

  ------------------------------------------
  --Answer
  ------------------------------------------

  --Get a list of all the names in the system
  DECLARE @Names NVARCHAR(MAX)

  SET @Names = (SELECT '[' + STUFF((SELECT '],[' + FirstName FROM Players ORDER BY FirstName FOR XML PATH('')),1,3,'') + ']')

  DECLARE @SQL NVARCHAR(MAX)

  --Create the matrix
  SET @SQL = '
  SELECT FirstName1,' + @Names + '
  FROM
  (
      SELECT P1.FirstName AS FirstName1,P2.FirstName AS FirstName2,R.Player1Result AS Result
      FROM  Results AS R
      INNER JOIN Players AS P1 ON P1.PlayerId = R.Player1Id
      INNER JOIN Players AS P2 ON P2.PlayerId = R.Player2Id

      UNION ALL

      SELECT P2.FirstName AS FirstName1,P1.FirstName AS FirstName2,R.Player2Result AS Result
      FROM  Results AS R
      INNER JOIN Players AS P1 ON P1.PlayerId = R.Player1Id
      INNER JOIN Players AS P2 ON P2.PlayerId = R.Player2Id
  ) AS P
  PIVOT
  (
      MAX (Result)
      FOR FirstName2 IN
      ( ' + @Names + ' )
  ) AS pvt
  ORDER BY pvt.FirstName1;
  '

  EXEC(@SQL)

  ------------------------------------------
  --Cleanup
  ------------------------------------------

  DROP TABLE Results
  DROP TABLE Players
  DROP TABLE Leagues

我想这与mysql无关。请移除标签。我已经为这个问题添加了一个核心答案。没问题。我相信和本页上的许多其他人一样,我也喜欢解决这样的问题。