「機関」と「エリア」の2つのテーブルがあります
「エリア」がそれ自体にリンクできるようにします。つまり、area_id、parent_area_id
このようにして、常に教育機関をarea_idにリンクすると、内部ロジックによって、その地域が地区と見なされるか都市と見なされるかを判断できます。
これで
institutions (
id UNSIGNED INT NOT NULL PK AI,
area_id UNSIGNED INT NOT NULL,
name VARCHAR NOT NULL
)
および
areas (
id UNSIGNED INT NOT NULL PK AI,
parent_area_id UNSIGNED INT NOT NULL DEFAULT 0,
name VARCHAR NOT NULL,
type ENUM('city','district') NOT NULL DEFAULT 'city'
)
area.typeフィールドはオプションですが、そのように定義する場合は、データベース内でそれを行う方法になる可能性があります(そうでない場合は、parent_area_id =0の場合は都市、それ以外の場合は地区であると想定します)
>このようにフィールドを選択するとき、あなたがしているのは
SELECT *
FROM institutions
INNER JOIN areas
ON areas.id = institutions.area_id
機関area_idがリンクしている場所を100%確信できます。地区または都市のテーブルに移動するかどうかに疑問符はありません。間違いなく、地域のテーブルに移動します。このテーブルは、地区と都市を同じように扱い、情報を表示します。フロントエンドが都市または地区として解釈する可能性のある形式。オプションで、本当にやりたい場合はさらに一歩進むことができます
SELECT
i.*,
COALESCE(a_parent.id,a_child.id) AS city_id,
COALESCE(a_parent.name,a_child.name) AS city_name
FROM institutions AS i
INNER JOIN areas AS a_child
ON a_child.id = i.area_id
LEFT JOIN areas AS a_parent
ON a_parent.id = a_child.parent_area_id
たとえば、教育機関が都市内の特定の地区に関連付けられている場合でも、常に都市名が返されます