यहां एक SQL क्वेरी है जो आपकी आवश्यकता को पूरा कर सकती है। यह MySQL JSON_ARRAYAGG() समग्र कार्य
JSON ऑब्जेक्ट्स की एक सरणी उत्पन्न करने के लिए (जो JSON_OBJECT()
)
sales
. उत्पन्न करने के लिए शामिल होने के भीतर समूहीकरण का एक मध्यवर्ती स्तर किया जाता है प्रत्येक उपयोगकर्ता की JSON सरणी। फिर परिणामों को एक पंक्ति में एकत्रित किया जाता है, जिसमें एक कॉलम होता है जिसमें परिणामी JSON ऑब्जेक्ट की सरणी होती है।
SELECT
JSON_ARRAYAGG(JSON_OBJECT('id', u.id, 'name', u.name, 'sales', s.sales))
FROM
user u
LEFT JOIN (
SELECT
user,
JSON_ARRAYAGG(JSON_OBJECT('id', id, 'item', item)) sales
FROM sale
GROUP BY user
) s ON s.user = u.id
यदि आप वापसी मान को JSON_PRETTY
. के साथ लपेटते हैं , आउटपुट इस प्रकार है:
[
{
"id": 1,
"name": "User 1",
"sales": [
{
"id": 1,
"item": "t-shirt"
},
{
"id": 2,
"item": "jeans"
}
]
},
{
"id": 2,
"name": "User 2",
"sales": [
{
"id": 3,
"item": "sweatpants"
},
{
"id": 4,
"item": "gloves"
}
]
}
]
संपादित करें :यहां MySQL <5.7 के लिए एक (बदसूरत) समाधान है, जहां JSON समर्थन उपलब्ध नहीं है। यह केवल स्ट्रिंग मैनिपुलेशन फ़ंक्शंस पर निर्भर करता है। कृपया ध्यान दें कि यह केवल तब तक काम करेगा जब तक कि वर्चर फ़ील्ड में "
. न हो चरित्र :
SELECT
CONCAT(
'[',
GROUP_CONCAT( CONCAT( '{ "id":', u.id, ', "name":"', u.name, '", "sales":', s.sales, ' }' ) SEPARATOR ', ' ),
']'
)
FROM
user u
LEFT JOIN (
SELECT
user,
CONCAT(
'[',
GROUP_CONCAT( CONCAT( '{ "id":', id, ', "item":"', item, '" }' ) SEPARATOR ', '),
']'
) sales
FROM sale
GROUP BY user ) s ON s.user = u.id