Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Binden Sie 3 Tabellen in 2 verschiedenen Fällen in MySQL

Habe 2 Tabellen, "Institutionen" und "Bereiche"

Erlaube „Areas“, sich selbst zu verlinken, d. h. area_id, parent_area_id

Auf diese Weise verknüpfen Sie eine Institution immer mit einer area_id, und dann kann die interne Logik bestimmen, ob dieses Gebiet als Distrikt oder Stadt betrachtet wird.

Sie haben also jetzt

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

und

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

Das Feld areas.type ist optional, aber wenn Sie sie als solche definieren möchten, kann dies eine Möglichkeit sein, dies innerhalb der Datenbank zu tun (andernfalls nehmen Sie einfach an, dass es sich bei parent_area_id =0 um eine Stadt handelt, andernfalls um einen Bezirk)

Auf diese Weise müssen Sie bei der Auswahl des Felds nur

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

Sie können sich zu 100 % sicher sein, wo die area_id der Institution verlinkt ist, es gibt kein Fragezeichen darüber, ob Sie zur Tabelle „Distrikte“ oder „Städte“ gehen sollen, es geht definitiv zur Tabelle „Bereiche“, die wiederum Bezirke und Städte auf die gleiche Weise behandelt und Informationen darin präsentiert ein Format, das Ihr Frontend dann als Stadt oder Bezirk interpretieren kann. Optional könnten Sie noch einen Schritt weiter gehen, wenn Sie wirklich wollten

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 

Das würde zum Beispiel immer den Stadtnamen zurückgeben, auch wenn die Institution an einen bestimmten Bezirk innerhalb einer Stadt gebunden ist