【发布时间】:2023-03-11 23:21:01
【问题描述】:
我在数据库中有这些表:
- 实体(ID、名称、已删除)
- entities_aliases(entity_id, alias_id)
- 别名(ID、姓名)
这个查询工作正常,但由于 UNION 速度很慢,请注意 entity.name 如何与 aliases.name 交换并移至最后一列:
SELECT entities.id, entities.name, entities.deleted, NULL AS main_name
FROM entities
UNION
SELECT entities.id, aliases.name, entities.deleted, entities.name AS main_name
FROM entities
JOIN entities_aliases ON entities_aliases.entity_id = entities.id
JOIN aliases ON entities_aliases.alias_id = aliases.id
ORDER BY name
这种交换对我来说非常重要,我无法删除它,但是随着数据库在宽度(更多字段和链接)和深度(更多记录)方面的发展,UNION 会变得越来越慢。如何摆脱 UNION?
添加: 我需要的输出。例如,我们有实体 1-AAA 和他的别名 1-BBB 和 2-CCC。输出应该是:
- AAA
- BBB (AAA)
- CCC (AAA)
【问题讨论】:
-
如果您确定对于给定的
entity_id,entities.name始终与ANY (aliases.name)不同,请使用UNION ALL。 -
我想问一下,你期望从这个查询中得到什么输出,让你想到使用联合的想法?不能说什么合适的查询可以替代这个查询,因为我们真的不知道你期望达到什么结果请进一步解释你想要的结果的逻辑
-
能不能先把表的结构放到这里做测试再给你答案?你也可以去这里创建它sqlfiddle.com/#
标签: mysql sql performance union