Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Liên kết 3 bảng trong 2 trường hợp khác nhau trong MySQL

Có 2 bảng, "Tổ chức" và "Khu vực"

Cho phép "Khu vực" liên kết với chính nó, tức là area_id, parent_area_id

Bằng cách này, bạn luôn liên kết Tổ chức với area_id và sau đó logic nội bộ có thể xác định xem khu vực đó được coi là Quận hay Thành phố.

Vì vậy, bây giờ bạn có

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

Các khu vực
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' 
)

Trường area.type là tùy chọn nhưng nếu bạn muốn xác định chúng như vậy thì đó có thể là một cách để thực hiện điều đó trong cơ sở dữ liệu (nếu không, chỉ cần giả sử rằng nếu parent_area_id =0 thì đó là thành phố, nếu không thì đó là quận)

Bằng cách này khi chọn trường, tất cả những gì bạn đang làm là

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

Bạn có thể chắc chắn 100% nơi mà area_id tổ chức liên kết đến, không có dấu chấm hỏi về việc có nên chuyển đến bảng Quận hoặc Thành phố hay không, nó chắc chắn sẽ chuyển đến bảng khu vực lần lượt xử lý các Quận và Thành phố theo cùng một cách và trình bày thông tin trong một định dạng mà giao diện người dùng của bạn sau đó có thể hiểu là thành phố hoặc quận. Tùy ý bạn có thể tiến thêm một bước nếu bạn thực sự muốn

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 

Ví dụ, điều đó sẽ luôn trả về tên thành phố ngay cả khi tổ chức được gắn với một quận cụ thể trong thành phố



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tham gia bên trong và thực hiện mệnh đề ở đâu trong ()?

  2. MySQL:Cách đơn giản để chuyển đổi giá trị của một trường int

  3. Làm cách nào để tìm nạp dữ liệu từ tệp nhật ký nhị phân và chèn vào bảng mong muốn của chúng tôi trong MySQL?

  4. Từ cơ số 10 đến cơ số 26 chỉ với các chữ cái để 26 sẽ là aa

  5. Tạo trình kích hoạt động Mysql trong thủ tục được lưu trữ