Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 高效查询一对多关系_Mysql_Sql_Database - Fatal编程技术网

Mysql 高效查询一对多关系

Mysql 高效查询一对多关系,mysql,sql,database,Mysql,Sql,Database,我有一个数据库,其中存储了有关游戏世界的信息。具体来说,我有一个表来存储所有不同的地图,还有一个表来存储每个地图中的建筑。地图可以有0-n个建筑物,我存储的信息如下: 地图(地图id(PK)、地图名称) 建筑物(建筑物标识(PK)、建筑物名称、地图标识(FK)) 我的问题是如何高效地查询数据库以获取地图及其所有建筑物的名称。例如,我想得到10张地图和它们的建筑 从地图中选择*使用(地图id)限制10连接建筑物 上面的查询可能返回10行或100行,但由于每个答案都重复map_名称,因此在结果表中有

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

地图(地图id(PK)、地图名称)

建筑物(建筑物标识(PK)、建筑物名称、地图标识(FK))

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

从地图中选择*使用(地图id)限制10连接建筑物

上面的查询可能返回10行或100行,但由于每个答案都重复map_名称,因此在结果表中有如此多的重复似乎是相当浪费的

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

从地图限制10中选择地图id

foreach map+id:
从map\u id=x的建筑中选择*

然而,当我执行11个单独的SQL查询时,这似乎又是一种浪费


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

我想你在寻找这个:

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)

我想你正在寻找这个:

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)

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


现在,如果要在GUI中显示此信息,以便用户可以查看它,则可能需要执行两个单独的查询—一个是获取地图列表,然后是一个单独的查询,在用户选择地图后获取建筑列表。如果您能告诉我们您到底想做什么,我们可能会给出更好的建议。

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


现在,如果要在GUI中显示此信息,以便用户可以查看它,则可能需要执行两个单独的查询—一个是获取地图列表,然后是一个单独的查询,在用户选择地图后获取建筑列表。如果您能告诉我们您到底想做什么,我们可能会给出更好的建议。

我需要返回地图名称。如果我使用你给出的那一个,我想我可以把自己限制为两个问题。谢谢,我也需要返回地图名。如果我使用你给出的那一个,我想我可以把自己限制为两个问题。谢谢