2012-06-27 78 views
0

我想尽可能少地组合几个查询。这是我正在写的视频游戏。 注意 -spawn_id是在地图上给定位置创建关卡上坏人的实体的标识。 - * from spawns包含spawn_id,产生的最大数量的坏人(数量),以及产生它们的坏人的类型(mob_id)以及产生它们的ID和告诉它产生什么类型的坏人 游戏是在线,所以我宁愿尽量减少查询的数量MYSQL优化组合查询

这将是很好,如果我可以从数量(游戏中的最大数量)中减去计数(游戏中已有数字),其中产卵ID是相同的,并返回所有在一起

甚至会更好,如果我能作为一个行一起返回产卵量ID产卵和坏人的型像这样

SELECT spawn_id在,COUN T(*)作为 '计数' FROM game_moblist GROUP BY spawn_id在” 回报......

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

表产卵包含

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

mob_id poitns到具有

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意味着统计数字是存储在“小怪”表中的数字的两倍

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

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 
         } 
         } 
        } 
       } 
      } 
      }); 
     }); 

回答

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 
+0

我在数量上添加了一个括号,并更改了一个表spawn_contains以产生 SELECT spawn_id,( 数量 - COUNT(game_moblist.spawn_id) )AS quantity_to_spawn,怪物。 * 从产卵 LEFT JOIN小怪 使用(mob_id) LEFT JOIN game_moblist 使用(spawn_id在) GROUP BY spawn_id在 LIMIT 0,30 谢谢你,真的帮了我了解一些的MySQL我是太不熟悉。 – Shawn

0

这正是使用LEFT或INNER JOIN的原因。请阅读这些SQL函数的工作原理 - 您将极大地提升您的SQL知识!

的基本想法是,如果你有两个表,也就是说,项目:

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 

这也有你能够复式指标添加到您的各种表格,以优化实际行查找的优势。

您还可以使用视图来创建自动提供这些关系的新虚拟表。

+0

我同意,我试图下面的查询 SELECT spawn_id在,COUNT(*)作为 '计数' FROM game_moblist LEFT JOIN game_moblist ON spawns.spawn_id = game_moblist.spawn_id GROUP BY spawn_id在 但它说# 1066 - 不是唯一的表格/别名:'game_moblist' 我理解左连接到一个学位,但它是有点超越我的水平做mysql中的算术和返回一个数量减计数和一个左连接上sapwn id然后一个第二次左加入mob_id – Shawn