Mysql
 sql >> Base de données >  >> RDS >> Mysql

Lier 3 tables dans 2 cas différents dans MySQL

Avoir 2 tables, "Institutions" et "Zones"

Autoriser "Areas" à se lier à lui-même, c'est-à-dire area_id, parent_area_id

De cette façon, vous associez toujours une institution à un area_id, puis la logique interne peut déterminer si cette zone est considérée comme un district ou une ville.

Vous avez donc maintenant

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

et

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

Le champ areas.type est facultatif mais si vous voulez les définir comme tels, cela peut être un moyen de le faire dans la base de données (sinon supposez simplement que si parent_area_id =0 alors c'est une ville, sinon c'est un district)

De cette façon, lorsque vous sélectionnez le champ, tout ce que vous faites est

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

Vous pouvez être sûr à 100 % de l'endroit où l'institution area_id est liée, il n'y a aucun point d'interrogation quant à savoir s'il faut aller à la table Districts ou Cities, il va certainement à la table des zones qui à son tour traite les districts et les villes de la même manière et présente les informations dans un format que votre frontal peut alors interpréter comme une ville ou un quartier. En option, vous pouvez aller plus loin si vous le souhaitez vraiment

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 

Cela, par exemple, renverrait toujours le nom de la ville même si l'institution était liée à un quartier spécifique dans une ville