mysql查询将子表作为json列获取

ar7v8xwq  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(268)

我有3个数据库表。
用户

用户\u书籍
在mysql查询中,我希望从users表、books和uers\u books中获取所有列,作为mysql查询中的json数据。所以结果的一列将包含json数据。
请参阅样本数据和预期结果。

Sample Data
=============
Users
------------------
user_id, user_name
------------------
1, User_A
2, User_B
3, User_C

Books
------------------
book_id, book_name
------------------
1, Book_A
2, Book_B
3, Book_C

Users_Books
-----------------------------------
assigned_date, user_id, book_id
-----------------------------------
01-01-2020, 1, 1
02-01-2020, 1, 2
03-01-2020, 1, 3
04-01-2020, 2, 1
05-01-2020, 3, 1
06-01-2020, 4, 1

Sample Output
==============================
user_id, user_name, json_col
------------------------------
1, User_A, (See Json Output below for this row)
2, User_B
3, User_C

[{
    "assigned_date": "01-01-2020",
    "user_id": "1",
    "book_id": "1",
    "book_detail": {
        "book_id": "1",
        "book_name": "Book_A"
    }
}, {
    "assigned_date": "02-01-2020",
    "user_id": "1",
    "book_id": "2",
    "book_detail": {
        "book_id": "2",
        "book_name": "Book_B"
    }
}, {
    "assigned_date": "03-01-2020",
    "user_id": "1",
    "book_id": "3",
    "book_detail": {
        "book_id": "3",
        "book_name": "Book_C"
    }
}]

我不想使用组\u concat。我只想像这个页面上的第一个解决方案一样使用join。mysql一对多到json格式

rkttyhzu

rkttyhzu1#

您应该使用json_object()和json_arrayagg()的组合。如果那不是你想要的,我很抱歉。

SELECT u.user_id, u.user_name,
  JSON_ARRAYAGG(
    JSON_OBJECT(
      'assigned_date', ub.assigned_date,
      'user_id', ub.user_id,
      'book_id', ub.book_id,
      'book_detail', JSON_OBJECT(
        'book_id', b.book_id,
        'book_name', b.book_name
      )
    )
  ) AS json_col
FROM Users AS u
JOIN Users_Books AS ub USING (user_id)
JOIN Books AS b USING (book_id)
GROUP BY u.user_id

MySQL5.7.22及更高版本支持这些json函数。如果您使用的是旧版本,则必须先升级。
p、 答:这与您的问题无关,但您应该以yyyy-mm-dd格式正确存储日期 DATE 列,而不是mm dd yyyy格式的字符串。

相关问题