2

1対多の関係を維持しているMySQLテーブルがあります。このテーブルは、フーズボール統計プログラムのパートナー リストを格納するためのものです。プレイヤーは、0、1、または 2 人のパートナーを持つことができます。

例えば:

___________________________________
| Table index | Partners | Players |
|      1      |     1    |  John   | - Singles, no partners
|      2      |     2    |  John   | - Doubles, John and Bob
|      3      |     2    |  Bob    | - Doubles, John and Bob
|      4      |     3    |  Dave   | - Roto doubles, Dave, Bob, John
|      5      |     3    |  Bob    | - Roto doubles, Dave, Bob, John
|      6      |     3    |  John   | - Roto doubles, Dave, Bob, John
|      7      |     4    |  Dave   | - Singles, no partners
____________________________________

テーブルからパートナーを追加および取得するための PHP スクリプトを作成していますが、クエリに問題があります。私はプレーヤーを知っており、パートナー フィールドを取得したいと考えています。実行する必要があるクエリは 3 つあります。

  • パートナーがいないことを確認してください - シングル;
  • 特定のパートナーを確認する - "Dave" とのダブルス。
  • 2 つの特定のパートナーを確認します - 「ボブとデイブ」とのダブルス。

エントリが存在する場合はそれを取得し、存在しない場合はそのエントリをテーブルに追加します。私が抱えている問題の 1 つは、たとえば、プレイヤー "John" が 3 つのエントリ、パートナーなし、1 つのパートナー、および 2 つのパートナーを持っていることです。エントリ 1 のみを抜き出し、2 や 6 を抜き出すように指定するにはどうすればよいですか?

ここで検索したところ、近いが必要なものではない例がいくつか見つかりました。この 1 つのmySQL: 1 対多のテーブルをクエリしていますか? ほとんど私が必要とすることをしますが、完全ではありません。

どんな助けでも大歓迎です。

クリス

4

1 に答える 1

0

あなたのスキーマを正しく理解している場合、Partners フィールドは実際には暗黙のグループ化テーブルへの外部キーです (つまり、TeamId という名前を付けて、各行が 1 つのパートナーシップを表す Team というテーブルにキーを設定する方がよいでしょう)。

適切に動作するように完全なスキーマを定義しましょう (これは基本的にテーブルと同じですが、わかりやすくするために非正規化されています。同じ名前の異なるプレイヤーを許可する名前ではなく、PlayerId を使用することもできます)。ここでの多対多のコネクタ テーブルは PlayerTeam です。

ここに画像の説明を入力

このクエリを実行すると、特定のプレーヤーの TeamId とチーム サイズを取得できます。

SELECT TeamId, count(PlayerId) as TeamSize
FROM PlayerTeam
WHERE TeamId IN (SELECT TeamId FROM PlayerTeam WHERE PlayerId = *your-player-id*)
GROUP BY TeamId

また、HAVING 句を追加することで、特定のサイズのチームを取得できます。

SELECT TeamId, count(PlayerId) as TeamSize
FROM PlayerTeam
WHERE TeamId IN (SELECT TeamId FROM PlayerTeam WHERE PlayerId = *your-player-id*)
GROUP BY TeamId
HAVING TeamSize = 2 

次のクエリを使用して、プレーヤーごとに 1 回クエリを実行する必要をなくすこともできます。

SELECT p.Name, p.PlayerId, pt.TeamId, sz.TeamSize
FROM Player p JOIN PlayerTeam pt USING(PlayerId)
   JOIN (SELECT TeamId, count(PlayerId) as TeamSize
         FROM PlayerTeam GROUP BY TeamId) AS sz USING(TeamId)

しかし、この最後のものを効果的に使用するには、結果を使用して、便利なインデックス付きの連想配列 ( など$team[UserId][TeamSize] => TeamId) を準備して決定を下す必要があります。

于 2013-09-16T14:39:04.137 に答える