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的明确外键。@TommyCrushmines
被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';