我在数据库中有这些表:
- 实体(id、名称、已删除)
- entities_aliases(entity_id, alias_id)
- 别名(id,名字)
此查询工作正常,但由于 UNION 速度较慢,请注意 entities.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)
最佳答案
我认为您可以使用 LEFT JOINS 和一些 IF 来实现它:
SELECT e.id, IFNULL( a.name, e.name ) AS name, e.deleted, IF( a.name IS NULL, NULL, e.name ) AS main_name
FROM entities AS e
LEFT JOIN entities_aliases AS ea ON e.id = ea.entity_id
LEFT JOIN aliases AS a ON ea.alias_id = a.id;
如果我明白你想要什么,你希望“名称”是别名或实体名称,如果没有别名(按此顺序),当你没有别名时 main_name 为空,并且有别名时的实体名称。 希望对您有所帮助!
关于MySQL 实体和实体的别名 : How to remove UNION?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10676873/