sql >> Databasteknik >  >> RDS >> Mysql

Bind 3 tabeller i 2 olika fall i MySQL

Har 2 tabeller, "Institutioner" och "Områden"

Tillåt "Areas" att länka till sig själv, dvs area_id, parent_area_id

På så sätt länkar du alltid en institution till ett area_id, och sedan kan intern logik avgöra om området anses vara ett distrikt eller en stad.

Så du har nu

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

och

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

Areas.type-fältet är valfritt men om du vill definiera dem som sådana kan det vara ett sätt att göra det i databasen (annars anta bara att om parent_area_id =0 så är det en stad, annars är det ett distrikt)

På detta sätt när du väljer fältet är allt du gör

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

Du kan vara 100 % säker på var institutionen area_id länkar till, det finns inget frågetecken över om du ska gå till tabellen Distrikt eller Städer, det går definitivt till tabellen för områden som i sin tur behandlar distrikt och städer på samma sätt och presenterar information i ett format som ditt användargränssnitt sedan kan tolka som stad eller distrikt. Alternativt kan du gå ett steg längre om du verkligen ville

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 

Det skulle till exempel alltid returnera stadsnamnet även om institutionen var knuten till en specifik stadsdel inom en stad



  1. Förstå skillnaden mellan EXCEPT och NOT IN-operatörer

  2. MySql Transponera rad till kolumn och kolumn till rad

  3. MySQL-utlösare och SUM()

  4. PL/pgSQL kolumnnamn samma som variabel