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 ?

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 ?

DDD
DDDoriginal
2024-11-28 06:31:11798parcourir

How to Avoid

Génération d'objets JSON imbriqués avec les fonctions JSON natives 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 :

  • La solution résout l'erreur « La sous-requête renvoie plus d'une ligne » en convertissant les résultats de la sous-requête en une chaîne séparée par des virgules.
  • Utilisation de CONCAT et conversion du Le résultat en JSON garantit que la structure imbriquée est correctement formatée.
  • Cette approche est compatible avec MySQL version 5.7.12 et plus.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn