3

私はデータベースにこれらのテーブルを持っています:

  • エンティティ(ID、名前、削除済み)
  • entity_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)
4

2 に答える 2

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 にし、エンティティ名の場合はエンティティ名にする必要があります。あなたにはエイリアスがあります。お役に立てば幸いです!

于 2012-05-20T21:32:14.813 に答える
0

次のクエリでは、UNION の代わりに UNION ALL を使用しています。

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 は、クエリから「個別の」プロセスを削除します。

適切なフォーマット (私が物事を行う方法として主観的に定義するもの) により、クエリが見やすくなります。また:

  1. entities.entity_id がエンティティの主キーであることを確認してください。
  2. alias.id が alias の主キーであることを確認してください。

フィルタリングを行っていないため、entity_aliases の外部キー関係はオプションです。

于 2012-05-20T20:37:19.237 に答える