0

我有一个存储有关游戏世界的信息的数据库。具体来说,我有一个表格来存储所有不同的地图,还有一个表格来存储每个地图中的建筑物。一张地图可以有 0-n 个建筑物,我将信息存储如下:

地图(map_id(PK),map_name)

建筑物(building_id (PK)、building_name、map_id (FK))

我的问题是如何有效地查询数据库以获取地图及其所有建筑物的名称。例如,我想获得 10 张地图及其建筑物。

SELECT * FROM maps JOIN buildings USING (map_id) limit 10

上面的查询可以返回 10 行或 100 行,但是由于每个答案都重复了 map_name,因此在结果表中存在如此多的重复似乎相当浪费。

或者,我可以先获取 map_ids,然后对每个地图执行单独的查询。例如。:

SELECT map_id from maps limit 10

foreach 地图+id:SELECT * FROM buildings WHERE map_id = x

但是,这似乎又是浪费,因为我正在执行 11 个单独的 SQL 查询?

综上所述,第一种方法似乎内存/带宽效率低下,第二种方法似乎 CPU 效率低下。我是对的吗?有更好的方法吗?

4

2 回答 2

2

我想你正在寻找这个:

SELECT * 
FROM buildings 
WHERE map_id IN (SELECT map_id from maps limit 10)

编辑:试试这个:

SELECT b.*, (SELECT map_name FROM maps m WHERE m.map_id = p.map_id) 'Map Name'
FROM buildings b
WHERE map_id NOT IN (SELECT map_id from maps limit 10)
于 2012-08-29T13:26:10.237 回答
1

我不会担心您的第一个查询中的内存/带宽效率低下,这就是关系数据库的设计目的。您的表已正确规范化,因此您将需要使用连接从两个表中提取数据。地图名称和 ID 在每一行上重复的事实是微不足道的,直到您开始拥有数以万计的地图,即使那样,这可能也没什么大不了的。

现在,如果您要在 GUI 中显示此信息以便用户可以查看它,您可能需要使用两个单独的查询 - 一个获取地图列表,然后一个单独的查询获取用户后的建筑物列表已选择地图。如果您让我们知道您到底想做什么,我们可能会提供更好的建议。

于 2012-08-29T13:32:34.410 回答