sql >> Database teknologi >  >> RDS >> Mysql

Bind 3 tabeller i 2 forskellige tilfælde i MySQL

Har 2 borde, "Institutioner" og "Områder"

Tillad "Areas" at linke til sig selv, dvs. area_id, parent_area_id

På denne måde forbinder du altid en institution til et area_id, og så kan intern logik afgøre, om dette område anses for at være et distrikt eller en by.

Så du har nu

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

og

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-feltet er valgfrit, men hvis du vil definere dem som sådan, kan det være en måde at gøre det på i databasen (ellers antag bare, at hvis parent_area_id =0, så er det en by, ellers er det et distrikt)

På denne måde, når du vælger feltet, er alt hvad du gør

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

Du kan være 100 % sikker på, hvor institutionen area_id linker til, der er intet spørgsmålstegn ved, om du skal gå til distrikts- eller bytabellen, det går helt sikkert til arealtabellen, som igen behandler distrikter og byer på samme måde og præsenterer information i et format, som din frontend derefter kan fortolke som by eller distrikt. Du kan eventuelt gå et skridt videre, hvis du virkelig 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 ville for eksempel altid returnere bynavnet, selvom institutionen var knyttet til en bestemt bydel i en by



  1. Valg af datoformater for aggregerede beregninger fra databasen med Django

  2. Billedeksempel og upload ved hjælp af PHP og MySQL-database

  3. Hvad er omkostningerne ved at bruge AUTOINCREMENT til SQLite på Android?

  4. Ekko-forespørgsel før udførelse og uden udførelse i codeigniter Active Record