假设我有一个现有的“项目”表,其中包含由“类型”字段区分的城市,州和国家,其中包含“城市”,“州”或“国家”。城市的字段“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)