2014-01-06 62 views
0

我正在開發一款具有地圖的遊戲。在地圖上,有幾個不同的項目,如城堡(普通玩家),礦山,空白點等,由type欄定義。這裏是世界的定義:根據列值加入

CREATE TABLE IF NOT EXISTS `world` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `type` tinyint(2) unsigned NOT NULL, 
    `x` int(11) NOT NULL, 
    `y` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `coors` (`x`,`y`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ; 

我還有其他的表像castlesmines我選擇它們的基礎上,type值:

foreach($spots as $spot){ 
    if($spot['type'] == 1){ 
     //it's normal castle 
      $db->get_castle($spot['id']); 
    }else if($spot['type'] == 2){ 
     //it's a mine 
      $db->get_mine($spot['id']); 
    }else{ 
     //empty spot, can be taken by anyone 
    } 
} 

現在我的問題:是否有加入不同的方式基於type的價值?

編輯: mines表的定義:

CREATE TABLE IF NOT EXISTS `mines` (
    `wid` int(10) unsigned NOT NULL, 
    `type` tinyint(2) unsigned NOT NULL, 
    `castle` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`wid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
+0

「城堡」和「礦山」的構成是什麼?在'world'中我沒有看到明確的外鍵,它指向另一個表中的id。 –

+0

@TommyCrush'礦山'被城堡俘虜。因爲'world'表可能引用兩個表,所以我無法創建一個外鍵! – undone

回答

0

有沒有辦法做到這一點,是不是那種骯髒。你在這裏找的是一個UNION聲明來組合多個查詢。我不確定每個表與另一個表的關係,所以這裏只是一個例子(我表現得像x,y coords在其他表格中形成了一些獨特的標識符,這足夠骯髒,你可能會以及作爲'foreign_key_id'列並用於關係,對於地雷它將涉及到mine_id,對於城堡它將涉及到castle_id等等。它不合適,但它會工作):

SELECT 'world'.'x','world'.'y','castle'.'thisfield' AS 'commonName' 
FROM 'world' 
INNER JOIN 'castle' 
ON ('world'.'x' = 'castle'.'x' AND 'world'.'y' = 'castle'.'y') 
WHERE 'world'.'type' = '1' 

UNION 

SELECT 'world'.'x','world'.'y','mines'.'thatfield' AS 'commonName' 
FROM 'world' 
INNER JOIN 'mines' 
ON ('world'.'x' = 'mines'.'x' AND 'world'.'y' = 'mines'.'y') 
WHERE 'world'.'type' = '2'; 

請注意,它們的輸出結合在一起,因此所有選中的列名必須相同(使用AS來實現這一點)。

+0

謝謝,但'城堡'和'礦井'沒有相同的列數,它們可能會隨着時間而改變,所以工會離開了桌子! – undone

+0

然後你沒有選擇。請記住,您可以在列中使用空字符串來填充空格(SELECT ...''AS'columnName') –