0

我想将几个查询组合成尽可能少的。这是我正在写的一个视频游戏。注意 -spawn_id 是在地图上给定位置的关卡上创建坏人的实体的 ID。-* 来自 spawns 包括 spawn_id、要生成的坏人的最大数量(数量)、要生成的坏人类型(mob_id)以及一个 ID,告诉它要生成的坏人类型 游戏在线所以我宁愿尽量减少查询的数量

如果我可以从生成 ID 相同的数量(游戏中的最大数量)中减去计数(游戏中已经存在的数量)并将其全部返回,那就太好了

如果我可以像这样将生成的生成ID数量和坏人的类型一起返回,那就更好了

SELECT spawn_id, COUNT(*) as 'count' FROM game_moblist GROUP BY spawn_id" 返回...

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

表生成包含

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

这意味着我必须插入从小怪中选择的 3 行,我不介意对其进行第二次查询,这样我就可以将统计数据逐级相乘,以在游戏中创建一个 2 级的坏人......基本上 2 级意味着统计数据是是“mobs”表中存储的数字的两倍

这是我的代码,到目前为止我可以完成它,但我宁愿先尝试减少查询的数量。

    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 或 INNER JOIN 的原因。请阅读这些 SQL 函数是如何工作的 - 这样您将大大提升您的 SQL 知识!

基本思想是,如果您有两个表,例如 Items:

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 回答