Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Ikat 3 tabel dalam 2 kasus berbeda di MySQL

Memiliki 2 tabel, "Institusi" dan "Area"

Izinkan "Area" untuk menautkan ke dirinya sendiri yaitu area_id, parent_area_id

Dengan cara ini Anda selalu menautkan Institusi ke area_id, lalu logika internal dapat menentukan apakah area tersebut dianggap sebagai Distrik atau Kota.

Jadi sekarang Anda memiliki

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

dan

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

Bidang area.type adalah opsional tetapi jika Anda ingin mendefinisikannya seperti itu maka itu mungkin cara untuk melakukannya di dalam basis data (jika tidak, anggap saja jika parent_area_id =0 maka itu adalah kota, selain itu distrik)

Dengan cara ini ketika memilih bidang yang Anda lakukan hanyalah

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

Anda dapat 100% yakin di mana area_id institusi terhubung, tidak ada tanda tanya apakah akan pergi ke tabel Kabupaten atau Kota, itu pasti menuju ke tabel area yang pada gilirannya memperlakukan Kabupaten dan Kota dengan cara yang sama dan menyajikan informasi di format yang kemudian dapat ditafsirkan oleh ujung depan Anda sebagai kota atau distrik. Secara opsional, Anda dapat melangkah lebih jauh jika Anda benar-benar ingin

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 

Itu misalnya akan selalu mengembalikan nama kota bahkan jika institusi itu terikat dengan distrik tertentu di dalam kota



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql regex utf-8 karakter

  2. kueri pemilihan mysql dalam array

  3. Beberapa wadah buruh pelabuhan untuk mysql atau satu instance dengan banyak database

  4. Bidang desimal MySQL dikembalikan sebagai string dalam PHP

  5. Apakah ada alasan MySQL tidak mendukung FULL OUTER JOINS?