Convert JSON array in MySQL to rows

后端 未结 7 1433
无人共我
无人共我 2020-12-01 13:41

UPDATE: This is now possible in MySQL 8 via the JSON_TABLE function: https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html

I\'m loving t

7条回答
  •  难免孤独
    2020-12-01 14:36

    1. Create a new table pseudo_rows with values from 0 until 99 - these will be used as keys (if your array has more than a hundred values, add more values into pseudo_rows).

    NOTE: If you're running MariaDB, you can skip this and simply use pseudo sequence tables (e.g. seq_0_to_99).

    CREATE TABLE `pseudo_rows` (
      `row` int(10) unsigned NOT NULL,
      PRIMARY KEY (`row`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT pseudo_rows VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24), (25), (26), (27), (28), (29), (30), (31), (32), (33), (34), (35), (36), (37), (38), (39), (40), (41), (42), (43), (44), (45), (46), (47), (48), (49), (50), (51), (52), (53), (54), (55), (56), (57), (58), (59), (60), (61), (62), (63), (64), (65), (66), (67), (68), (69), (70), (71), (72), (73), (74), (75), (76), (77), (78), (79), (80), (81), (82), (83), (84), (85), (86), (87), (88), (89), (90), (91), (92), (93), (94), (95), (96), (97), (98), (99)
    
    1. For this example, I'll be using a table events which stores groups of artists:
    CREATE TABLE `events` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `artists` json DEFAULT NOT NULL,
      PRIMARY KEY (`id`),
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    
    INSERT INTO `events` (`id`, `artists`) VALUES ('1', '[{\"id\": 123, \"name\": \"Pink Floyd\"}]');
    INSERT INTO `events` (`id`, `artists`) VALUES ('2', '[{\"id\": 456, \"name\": \"Nirvana\"}, {\"id\": 789, \"name\": \"Eminem\"}]');
    

    The query to get all artists, one per row, is as follows:

    SELECT 
        JSON_UNQUOTE(JSON_EXTRACT(events.artists, CONCAT('$[', pseudo_rows.row, '].name'))) AS performer
    FROM events
    JOIN pseudo_rows
    HAVING performer IS NOT NULL
    

    And the resultset is:

    performer
    ---------
    Pink Floyd
    Nirvana
    Eminem
    

提交回复
热议问题