1

私は非同期ゲームに取り組んでいますが、MySQL と PHP はまったく初めてです。tb_users と tb_matches の 2 つのテーブルがあります。最初のものは、すべてのユーザーとそのステータスを保存します (たとえば、「ステータス」列の値が 0 の場合、プレイヤーは待機中であることを意味し、値が 1 の場合、プレイヤーは対戦相手が対戦するのを待っていることを意味します) .

tb_matches テーブルには、アクティブな一致と非アクティブな (完了した) 一致の両方のすべての一致が格納されます。このテーブルには、プレーヤー ID を含む 2 つの列があります。

私がやろうとしているのは、次の要件を満たす必要がある利用可能な対戦相手を検索することです。

1) tb_users テーブルで 1 のステータスを持っている必要があります 2) 新しい対戦相手を探しているユーザーとのアクティブな一致がまだ存在していてはなりません

私は試してみました:

SELECT * 
FROM tb_users
JOIN tb_matches
WHERE tb_users.status = "1"
AND tb_matches.player1 != '".$username."'
AND tb_matches.player2 != '".$username."'

..しかし、それは私に結果を与えていません。また、tb_matches テーブルには一致するものがまったくない可能性があることも考慮する必要があります。

何か助けはありますか?また、このタスクを達成するためのより良い方法はありますか?

4

3 に答える 3

1

次の代替テーブル構造を検討してください。

tb_users
---------
id
name
seeking


tb_user_matches
---------------
match_id
player_id


tb_matches
----------
id
started
ended
status
  • 3 番目の (多対多) テーブルを追加して、どのプレイヤーがどの試合に関与しているかを格納すると、より簡単なクエリが可能になります。以下を参照してください。
  • 「ステータス」tb_usersを「シーク」に変更して、ブール型のデータ型が意味を持つようにします。
  • にプレイヤーを保存せずtb_matches、ID を保存します。(リンクを壊さずに名前を変更できます (正規化)。)
  • tb_matches試合の開始日と終了日を格納する日時フィールドを追加することを検討してください。将来役に立つかもしれません。
  • の「ステータス」列にtb_matchesは、次の 3 つのマッチ ステータスが表示されます。次のプレイヤーを待機中、進行中、完了です (以下を参照)。

この構造では、次のクエリを使用して、次のプレーヤーを見つけることができます。

  • 一致を検索中 (seeking = 1)
  • プレイヤーを待っている試合にまだ参加していない

SELECT u.id, u.name
FROM tb_users u
    LEFT JOIN tb_user_matches um
        JOIN tb_matches m
        ON um.match_id = m.id AND m.status = 0
    ON u.id = um.player_id
WHERE u.seeking = 1
AND um.match_id IS NULL;

tb_matches.status非アクティブ (プレイヤーを待っている) の場合は「0」、アクティブの場合は「1」、完了の場合は「2」を提案しています。

これは、プレイヤーがすでにアクティブな試合に参加しているかどうかを必ずしもチェックするわけではありません。あなたのゲームでは、プレイヤーが複数の同時対戦に参加できるようになっているでしょうか? そうでない場合は、クエリを変更して、アクティブな一致も除外することができます ( に変更m.status = 0) m.status != 2

編集:

クエリを英語で説明するには (できる限り):

ユーザー テーブルからユーザー ID と名前を選択します。試合ステータスが「0」(待機中)の場合に、ユーザーが関与している試合を含めます。(これLEFT JOINにより、ユーザーがステータス「0」の一致に関与していない場合、match_id は空 (null) になります。)

u.seeking = 1次に、この一連のデータから、検索中 ( ) で待機中の一致していない( ) ユーザーのみを表示しますum.match_id IS NULL

于 2013-05-31T19:01:40.790 に答える