sql >> Databáze >  >> RDS >> Mysql

Svažte 3 tabulky ve 2 různých případech v MySQL

Mít 2 tabulky, "Instituce" a "Oblasti"

Povolit „oblasti“, aby se na sebe propojily, tj. area_id, parent_area_id

Tímto způsobem vždy propojíte instituci s area_id a pak může vnitřní logika určit, zda je tato oblast považována za okres nebo město.

Takže teď máte

institutions (
    id UNSIGNED INT NOT NULL PK AI,
    area_id UNSIGNED INT NOT NULL,
    name VARCHAR NOT NULL
)

a

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' 
)

Pole area.type je nepovinné, ale pokud je chcete definovat jako takové, pak to může být způsob, jak to udělat v databázi (jinak předpokládejte, že pokud parent_area_id =0, pak je to město, jinak je to okres)

Tímto způsobem při výběru pole vše, co děláte, je

SELECT *
FROM institutions
INNER JOIN areas
ON areas.id = institutions.area_id

Můžete si být 100% jisti, kam instituce area_id odkazuje, není žádný otazník nad tím, zda přejít do tabulky Okresy nebo Města, rozhodně jde do tabulky oblastí, která zase zachází s okresy a městy stejným způsobem a prezentuje informace v formát, který vaše rozhraní může interpretovat jako město nebo okres. Volitelně můžete jít ještě o krok dále, pokud opravdu chcete

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 

To by například vždy vrátilo název města, i když byla instituce vázána na konkrétní obvod ve městě



  1. Jak převést řetězec na časové razítko v PostgreSQL

  2. Chyba SQL phpMyAdmin Nerozpoznané klíčové slovo poblíž FIELDS

  3. problém s nalezením seznamu souborů v adresáři

  4. Oprava:„přední přesnost intervalu je příliš malá“ v databázi Oracle