0

いくつかのクエリをできるだけ少なくしたいと思います。これは私が書いているビデオゲーム用です。注-spawn_idは、マップ上の特定の場所のレベルに悪者を作成するエンティティのIDです。-*スポーンからは、spawn_id、スポーンする悪者の最大数(quantity)、スポーンする悪者のタイプ(mob_id)、およびゲームをスポーンする悪者のタイプを示すIDが含まれます。したがって、Idはクエリの数を最小限に抑えます

スポーンIDが同じである量(ゲーム内にある最大量)からカウント(すでにゲーム内にある数)を差し引いて、それをすべて一緒に返すことができれば素晴らしいでしょう

スポーンIDの量と悪者のタイプを、このように1つの行として一緒に返すことができれば、さらに良いでしょう。

SELECT spawn_id、COUNT(*)as'count' FROM game_moblist GROUP BYspawn_id"は...を返します。

spawn_id count
======== =====
1         2

TABLEスポーンには

spawn_id quantity mob_id level
======== ======== ====== =====
1        5        1      2

mob_idは、

mob_id ...stats for mob_id
====== ===================
1      unique stats for mob#1

私はこのようなものを返したいです:

spawn_id   quantity_to_spawn   mob_id   ...stats for mob_id
========   =================   ======
1          3                   1        unique stats for mob#1

つまり、2番目のクエリを実行してもかまわないmobから選択した3行を挿入する必要があります。これにより、統計をレベルで乗算して、レベル2の悪者をゲームに作成できます...基本的にレベル2は、統計が'mobs'テーブルに格納されている数の2倍

これまでのところ、コードを完成させることができましたが、最初にクエリの数を減らしたいと思います。

    sql= "SELECT spawn_id, COUNT(*) as 'count' FROM game_moblist  GROUP BY spawn_id"
       connection.query(sql, function(err, spawncount, fields) {
          sql= "SELECT  * FROM spawns"
          connection.query(sql, function(err, spawns, fields) {
             for (i=0;i<spawns.length;i++){
                if (spawns[i].next_spawn < new Date().getTime()){
               for (j=0;spawncount.length;j++){
                      if (spawncount[j].spawn_id ==spawns[i].spawn_id&&spawncount[j].count<spawns[i].quantity){
                         quantity_to_spawn = spawns[i].quantity -spawncount[j].count
                         //fetch spawns[i].mob_id mob from mobs table
                         for(k=0;k<quantity_to_spawn;k++){
                         //multiply for level
                         //insert into moblist
                         }
                      }
                   }
                }
             }
          });
       });
4

2 に答える 2

0

これが、LEFTまたはINNERJOINを使用する理由です。これらのSQL関数がどのように機能するかを読んでください-そのようにしてSQLの知識を大幅にアップグレードします!

基本的な考え方は、2つのテーブルがある場合、たとえば、アイテム:

item      name
=====     =====
1         Sword of Ultimate Power
2         Big Freaking Gun

と場所:

location  name
========  =====
1         Fortress of Solitude
2         Quendor

次に、どのアイテムがどの場所にあるかを追跡するテーブルitem_locationsが必要です。

item_id    location_id
========   ============
1          2
2          1

次に、次のような式を使用できます

SELECT item.name, location.name FROM items LEFT JOIN item_locations AS il ON (item.id = il.item_id) LEFT JOIN locations ON (il.location_id = locations.id)

次に、次のようなリストを返します。

item.name                  location.name
===============            ================
Sword of Ultimate Power    Quendor
Big Freaking Gun           Fortress of Solitude

これには、実際の行ルックアップを最適化するために、さまざまなテーブルに複数のインデックスを追加できるという利点もあります。

ビューを使用して、これらの関係を自動的に提供する新しい仮想テーブルを作成することもできます。

于 2012-06-27T18:52:46.797 に答える
0
SELECT 
 spawn_id,
 quantity - COUNT(game_moblist.(spawn_id)) AS quantity_to_spawn,
 mobs.*
FROM spawn_contains
LEFT JOIN mobs USING (mob_id)
LEFT JOIN game_moblist USING (spawn_id)
GROUP BY spawn_id
于 2012-06-27T18:52:57.357 に答える