Maison >base de données >tutoriel mysql >Comment éviter les erreurs « La sous-requête renvoie plus d'une ligne » lors de la génération d'objets JSON imbriqués dans MySQL ?
Problème :
Les utilisateurs MySQL cherchant à utiliser des fonctions JSON natives peuvent sont confrontés à des défis lors de la création d'objets JSON imbriqués à partir d'une base de données relationnelle. Plus précisément, tenter de créer des sous-objets à partir de relations un-à-plusieurs déclenche des erreurs « La sous-requête renvoie plus d'une ligne ».
Solution :
Pour générer efficacement des JSON utilisant MySQL, il est crucial d'éviter d'utiliser des sous-requêtes qui renvoient plusieurs résultats dans l'entrée d'un objet parent. Au lieu de cela, concaténez les résultats à l'aide de la fonction GROUP_CONCAT et convertissez-les en un tableau JSON.
Exemple :
En s'appuyant sur l'exemple fourni dans la question, la requête suivante générer la structure JSON souhaitée :
SELECT JSON_OBJECT( 'id', p.id, 'desc', p.`desc`, 'child_objects', ( SELECT CAST(CONCAT('[', GROUP_CONCAT(JSON_OBJECT('id', id, 'parent_id', parent_id, 'desc', `desc`)), ']') AS JSON) FROM child_table AS c WHERE c.parent_id = p.id ) ) FROM parent_table AS p;
Cette requête utilise CONCAT et GROUP_CONCAT pour fusionner les sous-objets souhaités dans le résultat final. La conversion de la chaîne concaténée en type de données JSON garantit le formatage correct de la structure imbriquée.
Résultat :
L'objet JSON rendu s'alignera étroitement sur le format spécifié dans la question :
{ "id": 1, "desc": "parent row 1", "child_objects": [ { "id": 1, "parent_id": 1, "desc": "child row 1" }, { "id": 2, "parent_id": 1, "desc": "child row 2" } ] }
Supplémentaire Remarques :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!