MySQL实体和实体的别名:如何删除UNION?

时间:2012-05-20 20:18:02

标签: mysql sql performance union

我在数据库中有这些表:

  • 实体(id,name,deleted)
  • entities_aliases(entity_id,alias_id)
  • 别名(id,name)

此查询工作正常,但由于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)

2 个答案:

答案 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”进程。

良好的格式化*我主观地定义为我做事的方式)使我更容易看到查询。也:

  1. 确保entities.entity_id是实体的主键。
  2. 确保alias.id是别名的主键。
  3. 您没有进行任何过滤,因此entity_aliases上的外键关系是可选的。