Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

विशिष्ट JSON प्रारूप के लिए SQL क्वेरी पैरेंट-चाइल्ड कैसे करें?

आप सीधे MySQL से JSON कंटेंट जेनरेट कर सकते हैं। यहाँ एक समाधान है जो MySQL 5.7 या उच्चतर के साथ काम करता है।

एक शुरुआत के रूप में, consider function JSON_OBJECT() , जो तालिका में प्रत्येक रिकॉर्ड के लिए एक JSON ऑब्जेक्ट उत्पन्न करता है:

SELECT 
    p.*, 
    JSON_OBJECT('id', id, 'project_name', project_name, 'parent_id', parent_id) js
FROM tbl_projects p;

आपके नमूना डेटा को देखते हुए, यह लौटाता है:

| id  | project_name        | parent_id | js                                                               |
| --- | ------------------- | --------- | ---------------------------------------------------------------- |
| 1   | Carmichael House    | 0         | {"id": 1, "parent_id": 0, "project_name": "Carmichael House"}    |
| 2   | Carmichael Kitchen  | 1         | {"id": 2, "parent_id": 1, "project_name": "Carmichael Kitchen"}  |
| 3   | Carmichael Bathroom | 1         | {"id": 3, "parent_id": 1, "project_name": "Carmichael Bathroom"} |
| 4   | Dowd Apartment      | 0         | {"id": 4, "parent_id": 0, "project_name": "Dowd Apartment"}      |
| 5   | Dowd Kitchen        | 4         | {"id": 5, "parent_id": 4, "project_name": "Dowd Kitchen"}        |

आपका अपेक्षित आउटपुट जेनरेट करने के लिए, हम स्वयं-JOIN . करेंगे बच्चों के रिकॉर्ड खोजने के लिए तालिका, और एग्रीगेट फंक्शन JSON_ARRAYAGG() आंतरिक JSON सरणी उत्पन्न करने के लिए। एकत्रीकरण का एक अतिरिक्त स्तर सब कुछ एक ही वस्तु में भर देता है। जैसा कि आपके नमूना डेटा में दिखाया गया है, मुझे लगता है कि रूट प्रोजेक्ट में parent_id = 0 . है और यह कि पदानुक्रम का केवल एक स्तर है:

SELECT JSON_OBJECT('projects', JSON_ARRAYAGG(js)) results
FROM (
    SELECT JSON_OBJECT(
        'id', p.id, 
        'project_name', p.project_name, 
        'parent_id', p.parent_id,
        'children', JSON_ARRAYAGG(
            JSON_OBJECT(
                'id', p1.id, 
                'project_name', p1.project_name, 
                'parent_id', p1.parent_id
            )
        )
    ) js
    FROM tbl_projects p
    LEFT JOIN tbl_projects p1 ON p.id = p1.parent_id
    WHERE p.parent_id = 0
    GROUP BY p.id, p.project_name, p.parent_id
) x

पैदावार:

| results                                                                                                                                                                                                                                                                                                                                                              |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| {"projects": [{"id": 1, "children": [{"id": 2, "parent_id": 1, "project_name": "Carmichael Kitchen"}, {"id": 3, "parent_id": 1, "project_name": "Carmichael Bathroom"}], "parent_id": 0, "project_name": "Carmichael House"}, {"id": 4, "children": [{"id": 5, "parent_id": 4, "project_name": "Dowd Kitchen"}], "parent_id": 0, "project_name": "Dowd Apartment"}]} |

DB Fiddle पर डेमो




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Utf8 से utf8mb4 में बदलने से मेरा डेटाबेस धीमा क्यों हो गया?

  2. Mysql में दो उपयोगकर्ता के संचार के बीच नवीनतम संदेश का चयन करें

  3. MySQL ड्रॉप विदेशी कुंजी बाधा

  4. MySQL कनेक्टर ODBC odbc.ini 'विकल्प' ध्वज मान

  5. एक पैटर्न के आधार पर mysqldump में टेबल छोड़ें