我在数据库中有这些表:
此查询工作正常,但由于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。输出应为:
答案 0 :(得分:1)
我认为你可以使用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;
如果我明白你想要什么,你想要" name"如果没有别名(按此顺序),则为别名或实体名称;如果没有别名,则main_name为null;如果有别名,则为实体名称。 我希望它有所帮助!
答案 1 :(得分:0)
以下查询只使用UNION ALL而不是UNION:
SELECT *
FROM ((SELECT entities.id, entities.name, entities.deleted, NULL AS main_name
FROM entities
) union all
(SELECT entities.id, aliases.name, entities.deleted, entities.name AS main_name
FROM entities e join
entities_aliases ea
ON ea.entity_id = e.id JOIN
aliases a
ON ea.alias_id = a.id
)
) e
ORDER BY name
UNION ALL从查询中删除“distinct”进程。
良好的格式化*我主观地定义为我做事的方式)使我更容易看到查询。也:
您没有进行任何过滤,因此entity_aliases上的外键关系是可选的。