我想尽可能少地组合几个查询。这是我正在写的视频游戏。 注意 -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
}
}
}
}
}
});
});
我在数量上添加了一个括号,并更改了一个表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