查询在MySQL中存储为整数数组(Varchar)的游戏地图

时间:2013-01-15 02:45:37

标签: mysql sql database

我正在尝试在MySQL数据库中存储有关游戏地图的信息。为此,我将为每个包含整数数组的映射提供一个VARCHAR字段。这个整数数组将包含1000个数字,这些数字对应于存储在数据库中的不同图形元素的id。

例如,它可能包含这样的2d数组(3x3单元格映射)

1,1,4
2,5,6
1,1,1

我的数据库中会有一个像这样的表

tiles
id   |   file      |  desc          | other data //...
 1      grass.png     a grass tile
 2      water.png     a water tile

当用户在数据库中查询地图时,我需要发送2d数组以及有关元素的信息。例如如果数组包含数字2,我需要返回信息,说明任何id为2的单元格应该绘制为水砖,文件名为water.png等。

如何最有效地实现这一目标?我真的不想在php中浏览整个数组,获取唯一的id值并在之后再次查询数据库(对我来说效率低下)。

我正在考虑让另一个字段包含4,1,2,5,6格式的唯一ID,每当更改2d数组时都会更新。如果这是一个好主意,我该如何使用它进行查询?下面这样的事似乎不适合我

SELECT * FROM tiles WHERE id IN ( SELECT unique_ids FROM mapInfo WHERE id = ..)

1 个答案:

答案 0 :(得分:0)

基本上,在列数据中使用逗号分隔列表非常不灵活。您认为应该创建逗号分隔列表的任何时候,您可能应该创建一个新表并将该列表中的每个项目放在一个单独的行中,然后将该新表格与原始表格相关联。

我建议您创建一个名为“cell”的表,其中包含以下列:

CREATE TABLE cell (
  row INT NOT NULL, 
  col INT NOT NULL, 
  tile_id INT NOT NULL,
  PRIMARY KEY (row, col)
);

然后你会用这样的瓷砖信息查询2d数组:

SELECT c.row, c.col, t.*
FROM cell c
INNER JOIN tile t
  ON c.tile_id = t.id
ORDER BY c.row, c.col;

如果您想要多个“级别”或“地图”,请在您的单元格表中添加map_id列,以便将它们分开。您还应该将该列添加到主键的开头,您可以这样查询:

SELECT c.row, c.col, t.*
FROM cell c
INNER JOIN tile t
  ON c.tile_id = t.id
WHERE c.map_id = 2  -- or whatever map you are looking for
ORDER BY c.row, c.col;

您甚至可能想要保留地图表,以便为每个地图存储名称,可能是尺寸(100x100,200x300等)等。

只是一些想法。