1

私は。。をしようとしています:

各プレーヤーについて、events_tableにリストされている各イベントから結果を取得し、ベスト3の結果の合計を表示します。

John id = 1がすべてプレイし、16,11,12,4を獲得したため、トップ3 = 39

このデータを取得する最も簡単な方法は何ですか?

Player_table

id  /   name
------------
1   /   john
2   /   sam
3   /   bill
4   /   joe

Events_table

id  /   date
------------------
1   /   01/03/2012
2   /   04/04/2012
3   /   06/06/2012
4   /   08/08/2012

event_id_1_results_table

player_id   /   score
---------------------
1           /   12
3           /   16
0           /   11
0           /   8

event_id_2_results_table

player_id   /   score
---------------------
1           /   16
2           /   14
3           /   11
0           /   14

event_id_3_results_table

player_id   /   score
---------------------
1           /   8
3           /   12
4           /   13
0           /   18

event_id_4_results_table

player_id   /   score
---------------------
2           /   6
3           /   4
4           /   9
0           /   7
4

2 に答える 2

0

異なるテーブルを保持する必要がある場合、または保持したい場合は、ユニオンを使用します。

select sum(score)
from ((select score from event_id_1_results_table where player_id = 1)
       union
       (select score from event_id_2_results_table where player_id = 1)
       union
       (select score from event_id_3_results_table where player_id = 1)
       order by score desc limit 3)
于 2012-10-17T09:41:19.850 に答える
0

このデータベース構造使用する必要があるとしましょう。

最初に変数でイベントを取得してから、次の$eventsようにイベント ID を使用して結果クエリを生成する必要があります。

$results = array();
$event_joins = array();
foreach ($events as $v) {
   // eX.score AS eX_score
   $results[] = "e".$v['id'].".score AS e".$v['id']."_score"; 
   // LEFT JOIN event_id_X_results_table AS eX ON eX.player_id = Pt.id
   $event_joins = " LEFT JOIN event_id_".$v['id']."_results_table AS e".$v['id']."
                    ON e".$v['id'].".player_id = Pt.id ";
}
$qs = "SELECT Pt.*, 
      ".implode(",", $results)."
      FROM Player_table AS Pt
      ".implode("", $event_joins);

上記で生成されたクエリは、次のようなテーブルになります。

id / name / e1_score / e2_score / e3_score / e4_score
-----------------------------------------------------
 1 / john /       12 /       16 /        8 /     NULL
 2 / sam  /     NULL /       14 /     NULL /        6
 3 / bill /       16 /       11 /       12 /        4
 4 / joe  /     NULL /     NULL /       13 /        9

この結果を使用して、各プレーヤーの 3 つの最高スコアを決定し、それらを合計できます。

イベントの数によっては、すべてのイベント結果が別々のテーブルにあるため、非常に醜い大きな結合クエリになる可能性があるため、データベース構造を制御できる場合は、データベース構造を再考することを強くお勧めします.

于 2012-10-17T09:29:18.697 に答える