【问题标题】:How do I query for an object with an object array property in MySQL?如何在 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 

【问题讨论】:

    标签: mysql sql subquery database-abstraction


    【解决方案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 
      

      【讨论】:

      • 我认为你错过了重点......父母可以有多个孩子。
      猜你喜欢
      • 2014-11-22
      • 2013-08-29
      • 1970-01-01
      • 2021-11-14
      • 2013-10-14
      • 2014-05-07
      • 1970-01-01
      • 2021-11-08
      相关资源
      最近更新 更多