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

Cách nối các mảng với MySQL từ 3 bảng có mối quan hệ nhiều-nhiều

Phương pháp "eazy" là sử dụng CONCAT để tạo JSON.
Và sử dụng GROUP_CONCAT để kết hợp nhiều bản ghi nhóm thành một mảng JSON.
Methotde này cũng hoạt động trong các phiên bản MySQL cũ hơn không hỗ trợ tạo các hàm JSON.

Truy vấn

SET SESSION group_concat_max_len = @@max_allowed_packet

SELECT 
 CONCAT(
     "{"
   ,     '"id"' , ":" , '"' , friends.id , '"' , ","
   ,     '"name"' , ":" , '"' , friends.name , '"' , ","
   ,     '"team"' , ":" , "["
                              , GROUP_CONCAT('"', teams.name, '"')
                        , "]"
   , "}"
   ) AS json
FROM 
 friends 
INNER JOIN 
 relations 
ON 
 friends.id = relations.friends_id
INNER JOIN
 teams 
ON
 relations.teams_id = teams.id
WHERE 
 friends.id = 1

Kết quả

|                                                            json |
|-----------------------------------------------------------------|
| {"id":"1","name":"David Belton","team":["Cleveland Cavaliers"]} |

bản trình diễn

http://www.sqlfiddle.com/#!9/4cd244/19

Đã chỉnh sửa thêm bạn bè

Truy vấn

SET SESSION group_concat_max_len = @@max_allowed_packet

SELECT
  CONCAT(
      "["
    , GROUP_CONCAT(json_records.json) # combine json records into a string
    , "]"
  )  AS json
FROM (

  SELECT 
     CONCAT(
       "{"
     ,     '"id"' , ":" , '"' , friends.id , '"' , ","
     ,     '"name"' , ":" , '"' , friends.name , '"' , ","
     ,     '"team"' , ":" , "["
                              , GROUP_CONCAT('"', teams.name, '"')
                          , "]"
     , "}"
     ) AS json 
  FROM 
    friends 
  INNER JOIN 
    relations 
  ON 
    friends.id = relations.friends_id
  INNER JOIN
    teams 
  ON
    relations.teams_id = teams.id
  WHERE 
    friends.id IN(SELECT id FROM friends) #select the friends you need or just simply friends.id IN(1, 2)
  GROUP BY
     friends.id
) 
 AS json_records

Kết quả

|                                                                                                                                             json |
|--------------------------------------------------------------------------------------------------------------------------------------------------|
| [{"id":"1","name":"David Belton","team":["Cleveland Cavaliers"]},{"id":"2","name":"Alex James","team":["Boston Celtics","Cleveland Cavaliers"]}] |

bản trình diễn

http://www.sqlfiddle.com/#!9/4cd244/61




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gặp lỗi MYSQL:Mã lỗi:2006 - Máy chủ MySQL đã biến mất

  2. MySQLdb - Kiểm tra xem hàng có tồn tại Python không

  3. SQL Hiển thị bản ghi gần đây nhất trong GROUP BY?

  4. Truy vấn MySQL để tính toán tỷ lệ phần trăm của tổng số cột

  5. Đặt hàng bằng cách sử dụng các chữ cái Ba Lan