MySQL 实体和实体的别名 : How to remove UNION?

标签 mysql sql performance union

我在数据库中有这些表:

  • 实体(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/

相关文章:

mysql - 对于这个错误信息有什么解决办法吗?

php - SQLSTATE[23000] : Integrity constraint violation: 1052. Laravel 连接表时的 Eloquent 问题

php - 从另一个表 php 的值中对值进行排序

java - 如何通过 Hibernate 从数据库中删除一行及其所有引用?

sql - 意外表扫描 id != id

mysql - 我无法检索大于或等于 Sql 中特定日期的日期。

performance - TSQL : Which real number type results in faster comparisons

c++ - CString += 运算符性能问题

performance - 我们可以期待 kdb+ 32bit 的性能

php - 随机化输出