2017-01-26 12 views
1

私は7つの脇見のフットボールゲームのチームと得点を記録するデータベースを持っています。 チームは毎週変更されますが、勝利チームに参加するたびに、3ポイント(損失の場合は抽選0の場合は1)が割り当てられます。複数のデータ行を使用して比較選択を行うためのビューを作成する

ID 21のプレーヤーを選んで、彼がプレイしたゲームのリストを作成し、その後、他のプレーヤーと一緒にプレイしたポイントとゲームの合計数を与えることができます。

私は過去数時間にわたってこれを評価するためのクエリを作成していますが、それを解読することはできません。私のプロセスは次のとおりです。ゲームにそのプレイヤー21を果たしてきたすべてのプレイヤーIDの

1)リストプレーヤー21は

2で再生しているすべてのゲーム)のリストがで果たしてきました

3。 )プレイヤー21がプレイしたゲームのいずれかに登場したときに、上にリストされている各プレーヤーIDについて、リストされたプレーヤーIDの合計ポイントを合計し、出現回数をカウントします。

プレーヤー21は

mysql> SELECT Game, GameDate, Team, PlayerID FROM Teams WHERE PlayerID='21'; 
    +------+------------+------+----------+ 
    | Game | GameDate | Team | PlayerID | 
    +------+------------+------+----------+ 
    | A | 2017-01-10 | A |  21 | 
    | A | 2017-01-17 | A |  21 | 
    | A | 2017-01-24 | A |  21 | 
    | B | 2017-01-10 | A |  21 | 
    | B | 2017-01-17 | A |  21 | 
    | B | 2017-01-24 | A |  21 | 
    | C | 2017-01-10 | A |  21 | 
    | C | 2017-01-17 | A |  21 | 
    +------+------------+------+----------+ 
    8 rows in set (0.00 sec) 

2)リストで再生している1)リストのすべてのゲームのすべてのプレイヤーIDのそのプレイヤー21がで果たした試合に出場していること。

LIMIT 1 OFFSET 0を指定してこのクエリを実行しようとすると、エラーmore than one row selectedが発生します。

mysql> 
SELECT PlayerID, Game, GameDate, Team 
FROM Teams 
WHERE Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 0) 
AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 0) 
AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 0); 
     +----------+------+------------+------+ 
     | PlayerID | Game | GameDate | Team | 
     +----------+------+------------+------+ 
     |  5 | A | 2017-01-10 | A | 
     |  8 | A | 2017-01-10 | A | 
     |  11 | A | 2017-01-10 | A | 
     |  12 | A | 2017-01-10 | A | 
     |  14 | A | 2017-01-10 | A | 
     |  15 | A | 2017-01-10 | A | 
     |  21 | A | 2017-01-10 | A | 
     +----------+------+------------+------+ 
     7 rows in set (0.00 sec) 

これは、プレイヤー21

で、最初のゲーム/行に果たしてきたすべてのプレイヤーが一覧表示されますが、私はすべてを得ることができるように、私はOFFSET @Xをインクリメントするには、このクエリを置くことができるloopのいくつかのフォームがありますこれらのゲームとプレイヤーIDは1つの表に記載されていますか?

これは私がしようとしたものです:

SET @GameNumber = (SELECT Count(*) FROM Teams WHERE PlayerID='21'); 
SET @GameCount = 0; 
SELECT PlayerID, Game, GameDate, Team 
FROM Teams    
    WHILE(@GameNumber < @GameCount) DO 
     WHERE Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET @GameNumber) 
     AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET @GameNumber) 
     AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET @GameNumber); 
    SET @GameNumber = @GameNumer+1; 
    END WHILE; 

EDIT 1


を私は他のプレイヤーがで果たしていることができ、少なくともどのように多くのゲームポイントにそれを持っていますプレーヤー21.

SELECT Players.PlayerID, COUNT(*) AS Games 
FROM Teams, Players 

WHERE 
Teams.PlayerID=Players.PlayerID 
AND 
(
     (
     Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 0) 
     AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 0) 
     AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 0) 
     ) 
     or 
     (
     Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 1) 
     AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 1) 
     AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 1) 
     ) 
     or 
     (
     Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 2) 
     AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 2) 
     AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 2) 
     ) 
     or 
     (
     Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 3) 
     AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 3) 
     AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 3) 
     ) 
     or 
     (
     Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 4) 
     AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 4) 
     AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 4) 
     ) 
     or 
     (
     Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 5) 
     AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 5) 
     AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 5) 
     ) 
     or 
     (
     Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 6) 
     AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 6) 
     AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 6) 
     ) 
     or 
     (
     Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 7) 
     AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 7) 
     AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 7) 
     ) 
) 
GROUP BY Teams.PlayerID 
ORDER BY Games DESC 
; 

上記の表には、

+----------+-------+ 
| PlayerID | Games | 
+----------+-------+ 
|  15 |  8 | 
|  21 |  8 | 
|  8 |  8 | 
|  14 |  6 | 
|  5 |  6 | 
|  19 |  5 | 
|  11 |  5 | 
|  10 |  3 | 
|  12 |  3 | 
|  4 |  2 | 
+----------+-------+ 
10 rows in set (0.01 sec) 

答えて

0

私は初心者であると話します。 subquery returns more than 1 rowのエラーを調べていたところ、ANYが見つかりました。私の人生をはるかに簡単にする3文字の言葉。

SET @IDNumber := 21; 
SELECT Players.PlayerID, Players.Name, COUNT(Games.Points) AS Games_Played, SUM(Games.Points) AS Points, SUM(Points/Games_Played) AS Points_Per_Game 
FROM Teams, Players, Games 

WHERE 
Teams.PlayerID=Players.PlayerID 
AND 
Games.Game=Teams.Game 
AND 
Games.Team=Teams.Team 
AND 
Games.GameDate=Teams.GameDate 
AND 
(
CONCAT(Games.Game, '_', Games.Team, '_', Games.GameDate)= ANY(SELECT CONCAT(Teams.Game, '_', Teams.Team, '_', Teams.GameDate) FROM Teams WHERE [email protected]) 
) 

GROUP BY Teams.PlayerID 
ORDER By Points_per_Game DESC, Points DESC, Games_Played 
; 
関連する問題