MySQL如何在表的复杂排序中避免多次连接?

时间:2018-02-14 16:46:10

标签: mysql left-join sql-order-by

假设我有一个现有的“项目”表,其中包含由“类型”字段区分的城市,州和国家,其中包含“城市”,“州”或“国家”。城市的字段“parent_id”指向“州”条目或“国家”条目(如果该国家没有州)。

我有另一个“local_names”表,其中一些上面的项目有相应的本地名称,其他项目没有。

我希望按照“城市,国家”的顺序(当状态可用时)按照当地名称(或“原始”名称,如果缺少本地名称)订购所有物品。

表项目

id type    name         parent_id ...
 1 City    Detroit      2
 2 State   Michigan     3
 3 Country USA
 4 City    Cologne      5
 5 Country Germany

table local_names

id item_id name
 1      4  Koln
 2      5  Deutschland

通缉结果:

Detroit, USA
Koln, Deutschland

但以下表现相当差。怎么可以改进?

SELECT * FROM items
LEFT JOIN items AS parent ON parent.id = items.parent_id
LEFT JOIN items AS grandparent ON grandparent.id = parent.parent_id

LEFT JOIN local_names AS local_item_name ON local_item_name.item_id = items.id
LEFT JOIN local_names AS local_parent_name ON local_parent_name.item_id = parent.id
LEFT JOIN local_names AS local_grandparent_name ON local_grandparent_name.item_id = grandparent.id

ORDER BY coalesce(coalesce(local_grandparent_name.name, grandparent.name),
                  coalesce(local_parent_name.name, parent.name), 
                  coalesce(local_item_name.name, items.name)),
         coalesce(local_item_name.name, items.name)

0 个答案:

没有答案
相关问题