Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak połączyć tablice z MySQL z 3 tabel relacji wiele-do-wielu?

Metodą "eazy" jest użycie CONCAT do wygenerowania JSON.
I użyj GROUP_CONCAT, aby połączyć rekordy wielu zespołów w tablicę JSON.
Ta metoda działa również w starszych wersjach MySQL, które nie obsługują tworzenia funkcji JSON.

Zapytanie

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

Wynik

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

demonstracja

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

Edytowano więcej znajomych

Zapytanie

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

Wynik

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

demonstracja

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. Wybierz wiersz nadrzędny tylko wtedy, gdy nie ma w nim dzieci

  2. Jak używać REGEXP z sekwencjami specjalnymi, takimi jak granica słowa?

  3. Wyjście Pythona zlib, jak odzyskać z tabeli mysql utf-8?

  4. MySQL PDO przygotowane szybciej niż zapytanie? Tak pokazuje ten prosty test

  5. Laravel nie pozwoli mi na migrację tabeli, ponieważ już istnieje