如何在 MySQL 中查询具有对象数组属性的对象?

Posted

技术标签:

【中文标题】如何在 MySQL 中查询具有对象数组属性的对象?【英文标题】:How do I query for an object with an object array property in MySQL? 【发布时间】:2018-04-25 17:05:14 【问题描述】:

我以前曾以不同的方式看到过这个问题,但我希望得到一个直接的答案。

如果我有两个类,Parent 和 Child,存储在两个不同的 mysql 表中,查询完整 Parent 对象的最佳方法是什么,以及所有 Child 的列表?

例如

class Parent 
   id: number;
   name: string;
   Children: Child[]


class Child 
   id: number;
   name: string;
   age: number;

如何按名称获取匹配的父母列表,以及每个孩子的列表?

我是否必须编写一个查询来获取所有匹配的父级,然后为每个父级编写一个附加查询以获取所有子级元素?

这显然是伪 SQL,但我希望是这样的:

SELECT p.id, p.name, 
(SELECT * from c) as children from parent p LEFT JOIN child c on p.id = c.parent_id 

【问题讨论】:

【参考方案1】:

选择列表中的子查询(如您在伪代码中显示的那样)将不起作用,因为该上下文中的子查询必须是 标量子查询——换句话说,它必须只返回一行并且一栏。

您可以返回一个连接的结果集:

SELECT p.id, p.name, c.id, c.name
FROM parent p LEFT JOIN child c on p.id = c.parent_id;

但这会为每一行重复相同的 p.id 和 p.name。一些开发人员发现这很难处理(请参阅我在 How to separate data in SQL table 中的回答)

另一种方法是执行两个查询:

SELECT p.id, p.name FROM parent p;

SELECT c.id, c.name FROM child c WHERE c.parent_id = ?;

将 p.id 值作为参数提供给第二个查询。

【讨论】:

【参考方案2】:

如果你的父表容器 child_id 那么

SELECT p.id, p.name,c.name,c.age from parent p LEFT JOIN child c on p.child_id = c.id

如果您的子表包含 parent_id 则

SELECT p.id, p.name,c.name,c.age from parent p LEFT JOIN child c on p.id = c.parent_id

如果父母有多个孩子,那么

select parent.name,(select group_concat(name,'|',age) from child where child.parent_id = parent.id) as child  from parent 

【讨论】:

我认为你错过了重点......父母可以有多个孩子。

以上是关于如何在 MySQL 中查询具有对象数组属性的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel中搜索具有数组属性的对象数组

如何检查包含另一个对象数组的对象数组是不是具有属性

如何从对象数组中获取具有属性的列表,除非它包含具有特定值的另一个项目?

如何将具有相同属性的对象合并到一个数组中?

如何选择具有最低属性 linq 查询语法的对象

如何从一个数组中获取具有其他相同属性的对象?