sql >> データベース >  >> RDS >> Mysql

多対多の関係の3つのテーブルからMySQLと配列を結合する方法

    「簡単な」方法は、CONCATを使用してJSONを生成することです。
    そして、GROUP_CONCATを使用して複数のチームレコードをJSON配列に結合します。
    このメソッドは、JSON関数の作成をサポートしていない古いバージョンのMySQLでも機能します。

    クエリ

    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
    

    結果

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

    デモ

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

    さらに多くの友達を編集

    クエリ

    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
    

    結果

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

    デモ

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




    1. Postgresイベントトリガーで変更されたテーブルの名前を取得するにはどうすればよいですか?

    2. トランザクションログ構成の問題

    3. PSQLでユーザーを作成する方法

    4. mysqlストアドプロシージャ:出力パラメータ