2

Teamsこのシナリオには、との 3 つのテーブルが PlayersありPlayersInTeamsます。

APlayerは単なる登録ユーザーです。に関連付けられている W/L データはありませんPlayer

ATeamは、勝敗の記録を維持します。プレイヤーが 1 人でプレイしている場合、そのプレイヤーは自分の「ソロ」チーム (Teamそのプレイヤーだけがいる) でプレイします。Bob と Jan が一緒に勝つたびに、彼らのTeamエントリーは wins++ になります。ジェイソンとトミーが一緒に負けるたびに、彼らのチーム エントリーは負け++になります。

テーブルには 2 つの列しかなく、とPlayersInTeamsの間の交差テーブルです:PlayersTeams

> desc PlayersInTeams ;
+------------+---------+
| Field      | Type    |
+------------+---------+
| fkPlayerId | int(11) |
| fkTeamId   | int(11) |
+------------+---------+

したがって、ここが難しい部分です。

aPlayerは複数の の一部になる可能性があるため、マッチの開始時にテーブルからTeams権利をフェッチすることが重要です。TeamIdTeams

プレーヤーの SOLO チームは、

select fkTeamId from PlayersInTeams where
fkPlayerId=1 HAVING count(fkTeamId)=1;

いいえ、ちがいます!!しかし、私はその理由を理解していません。

私は言おうとしています:


fkPlayerId=1 のPlayersInTeams から fkTeamId を取得します
が、この特定の fkTeamId を持つ行の数は正確に 1 です。

クエリは (空のセット) を返し、実際に HAVING 句を正しくない ( HAVING count(fkTeamId)<>1;) に変更すると、目的の行が返されます。

4

5 に答える 5

2

最も自然なことは、行を数えて何が起こっているかを確認することです。

select fkTeamId, count(*)
from PlayersInTeams
where fkPlayerId=1
group by fkTeamId;

group by句は、クエリを記述するより自然な方法です。

select fkTeamId
from PlayersInTeams
where fkPlayerId=1
having count(fkteamid) = 1

ただし、プレーヤーの行が 1 つしかない場合は、元のバージョンが機能するはずです。フィルタリングによって 1 行になり、fkTeamId がその行のチームになり、havingこれが満たされます。1 つの可能性は、データに重複する行があることです。

重複が問題になる場合は、次のようにします。

select fkTeamId
from PlayersInTeams
where fkPlayerId=1
having count(distinct fkteamid) = 1

「ソロチーム」の編集:

Andomar が指摘したように、ソロチームの定義は、私が期待したものとはまったく異なります。チームで唯一のプレーヤーであるプレーヤーです。したがって、特定のプレーヤーがチームであるチームのリストを取得するには:

select fkTeamId
from PlayersInTeams
group by fkTeamId
having sum(fkPlayerId <> 1) = 0

つまり、他のプレイヤーを除外して、この情報を取得することを期待することはできません。彼らがチームに所属していないことを確認するために、特に彼らが必要です。

すべてのソロチームを取得したい場合:

select fkTeamId
from PlayersInTeams
group by fkTeamId
having count(*) = 1
于 2013-06-01T22:24:29.333 に答える
1

HAVINGは通常、GROUP BYステートメントで使用されます。これは、グループ化されたデータ WHEREに適用されるのようなものです。

SELECT fkTeamId
FROM PlayersInTeams
WHERE fkPlayerId = 1
GROUP BY fkTeamId
HAVING COUNT(fkPlayerId) = 1
于 2013-06-01T22:24:27.350 に答える
1

SqlFiddle はこちら: http://sqlfiddle.com/#!2/36530/21

最初にプレイヤーが 1 人のチームを見つけてから、そのチームのいずれかに所属している場合は、それを使用してプレイヤー ID を検索してみてください。

select DISTINCT PlayersInTeams.fkTeamId
from (
  select fkTeamId 
  from PlayersInTeams
  GROUP BY fkTeamId
  HAVING count(fkPlayerId)=1
) AS Sub
INNER JOIN PlayersInTeams
  ON PlayersInTeams.fkTeamId = Sub.fkTeamId
WHERE PlayersInTeams.fkPlayerId = 1;
于 2013-06-01T22:34:41.767 に答える