Php 基于列值的联接

Php 基于列值的联接,php,mysql,left-join,Php,Mysql,Left Join,我正在开发一个有地图的游戏。在地图中,有几个不同的项目,如城堡(普通玩家)、地雷、空位等,由类型列定义。以下是世界的定义: 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 (

我正在开发一个有地图的游戏。在地图中,有几个不同的项目,如城堡(普通玩家)、地雷、空位等,由
类型
列定义。以下是世界的定义:

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  ;
我还有其他一些表,比如
城堡
矿山
,我根据
类型的值来选择它们:

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
    }
}
现在我的问题是:有没有一种方法可以基于
类型
的值来连接不同的表

编辑:
矿山的定义
表:

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;

要做到这一点,没有不肮脏的方法。这里需要的是一个组合多个查询的语句。我不确定每个表与另一个表之间的关系,所以这里只是一个示例(我的行为就像x,y坐标在其他表中形成某种唯一标识符一样。这已经够脏了,你可以将其作为“外键id”列,并将其用于关系。对于矿山,它将与矿山id相关,对于城堡,它将与城堡id相关,等等。这不合适,但会起作用):


请注意,它们的输出是组合的,因此所有选定的列名称必须相同(使用AS以实现此目的).

castles
mines
的组成是什么?我在
world
中没有看到指向另一个表id的明确外键。@TommyCrush
mines
被castles捕获。由于
world
表可能引用两个表,我无法创建外键!谢谢,但是
castles
矿山
的列数不同,而且它们可能会随着时间的推移而变化,因此无法使用union!那么您就没有选择余地了。请记住,您可以在列中使用空字符串来填充空间(选择…''作为“columnName”)
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';