2017-12-28 22 views
0

私のMySQLデータベースには2つのテーブルがあります。 1つはプレイヤーと呼ばれ、もう1つのテーブルはワールドと呼ばれます。各プレイヤーには「レベル」と「世界」の列があります。私が達成したいのは、テーブルワールドのカラムをテーブルのプレーヤーのカラム値に基づいて記入することです。私はまず、その世界の選手の合計とそれらのレベルの平均を得たいと思っています。PHP/SQL - 別の列の合計を取得する

私のテーブルには、次のようになります。

表:プレーヤー

+-------+-------+--------+----------+-------+--------------+---------+--------+ 
| id | name | sex | vocation | level | achievements | world | online | 
+-------+-------+--------+----------+-------+--------------+---------+--------+ 
| 24471 | John | Male | None  | 92 |   3 | Antica |  1 | 
| 24493 | Bob | Male | None  | 76 |   19 | Amera |  0 | 
| 24535 | Sam | Male | None  | 75 |   0 | Antica |  0 | 
| 24574 | Sarah | Female | None  | 78 |   23 | Beneva |  1 | 
| 24673 | Carl | Male | None  | 75 |   10 | Belobra |  1 | 
+-------+-------+--------+----------+-------+--------------+---------+--------+ 

表:世界は

+----+---------+---------+--------+--------+----------+---------------+--------------+ 
| id | name | players | online | avglvl | totalexp | location |  pvp  | 
+----+---------+---------+--------+--------+----------+---------------+--------------+ 
| 1 | Amera |  0 |  0 |  0 |  0 | North America | Open PvP  | 
| 2 | Antica |  0 |  0 |  0 |  0 | Europe  | Open PvP  | 
| 3 | Astera |  0 |  0 |  0 |  0 | North America | Optional PvP | 
| 4 | Belobra |  0 |  0 |  0 |  0 | South America | Optional PvP | 
| 5 | Beneva |  0 |  0 |  0 |  0 | Europe  | Optional PvP | 
+----+---------+---------+--------+--------+----------+---------------+--------------+ 

したがって、たとえば、私たちが見ることができる選手ジョンサムには世界がAnticaです。したがって、Anticaは、テーブルの世界のプレーヤー列の下に値「2」を持つ必要があります。しかしJohnだけがAnticaのオンラインです。だから世界Anticaは、テーブル "世界"の列 "オンライン"の下に "1"の値を持つべきです。等々。私はまた、その世界の平均的な水準を求めています。

SQLクエリを作成することでこれをPHPでどのように達成できますか?

まず、私は世界のすべての名前を取得する必要がありますか?そして、それぞれの世界のために、以下の詳細を取得:

  • プレイヤー量

  • オンライン量

  • 平均レベルの量

そして世界のテーブルにして更新を行いますこれらの値を使用してください。

+1

あなたの質問は広すぎます。あなたはあなたが試したことを投稿できますか?あなたが失敗した可能性がありますか?そうすれば、少なくともあなたの側には何らかの努力が示されます。 –

答えて

1

あなたはupdateにこれを組み込むことができ

select world, count(*) as players, sum(online) as online, avg(level) as avglevel 
from players 
group by world; 

:としてデータをarize

update worlds w join 
     (select world, count(*) as players, sum(online) as online, avg(level) as avglevel 
     from players 
     group by world 
     ) p 
     on w.world = p.world 
    set w.players = p.player, 
     w.online = p.online, 
     w.avglevel = p.avglevel; 

私はこれは良いアイデアであるように別のテーブルを維持するとは思いません。結局のところ、あなたはいつもこの情報を得るためにplayersを照会することができます。また、2つのシステムはすぐに古くなってしまい、データに矛盾が生じます。トリガーを使用してそれを修正しますが、これはシステムに複雑さを増します。一般に、簡単なクエリで十分です。

+0

私の男!あなたはそれを解決しました!私はこのためにcronジョブを使用するつもりですので、古いものではありません。どうもありがとうございます!私は君を愛しているよ、おい!私はちょうどあなたのクエリでいくつかのタイプミスを発見したが、私はそれを修正した。 'on w.name = p.world'と' set w.players = p.players'でなければなりません。とてもsoooooooooありがとう! –

+0

@LeeCheung。 。 。 cronジョブであっても、テーブルは古くなってしまいます。あなたはビューを使う方が良いです。何らかの理由でテーブルにこれが必要な場合は、トリガーを探索する必要があります。 –

関連する問題