我正在开发一款带有地图的游戏。在地图上,有几个不同的项目,例如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
值选择的表,例如mines
,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;
最佳答案
没有办法做到这一点。您在这里寻找的是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可以做到这一点)。