我正在开发一款带有地图的游戏。在地图上,有几个不同的项目,例如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  ;


我还有其他基于castles值选择的表,例如minestype

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;

最佳答案

没有办法做到这一点。您在这里寻找的是UNION语句,用于组合多个查询。我不确定每个表之间的关系,所以这里只是一个例子(我的行为就像x,y坐标在其他表中也形成某种唯一标识符一样。就像“ 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可以做到这一点)。

09-09 22:33
查看更多