2012-06-27 81 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