我有一个具有实体属性值结构的表。举个例子,作为实体我可以有不同的国家。我可以拥有以下属性:“位于”、“与”、“首都”接壤。

然后我想找到所有“位于亚洲”并且“与俄罗斯接壤”的国家。最简单的方法是使用实​​体将表与其自身连接起来,实体是用于连接的列,然后使用 where.

但是,如果实体列中有 20 行俄罗斯所在的行,那么在联合表中,我将有 20*20=400 行以俄罗斯为实体。每个国家都是如此。所以,联合表将会很大。

使用原始表提取所有位于亚洲的国家,然后提取所有与俄罗斯接壤的国家,然后使用位于两组国家中的元素,不是更有效吗?

有帮助吗?

解决方案

您最终不应该拥有大量记录,因此这应该可行

SELECT  a.entity,
    a.located_in,
    a.border
FROM    my_table a
WHERE   a.border in (SELECT b.entity FROM my_table b WHERE b.entity = 'RUSSIA' )
AND     a.located_in = 'ASIA'

其他提示

您对连接与笛卡尔积感到困惑。连接中的行数不可能多于实际数据中的行数,唯一改变的是 哪个 获取元素/行。

因此,如果有 20 个俄语行,则连接生成的表中的俄语条目永远不会超过 20 个。

您建议使用的操作正是联接所做的操作。只需确保您有适当的索引,然后让 MySQL 完成其余的工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top