在PHP中从数据库创建嵌套数组

时间:2014-05-09 20:11:37

标签: php mysql arrays

我的数据库中有一些表以不同的方式在它们之间建立关系。现在我想用PHP创建嵌套数组,这样我的数组结构就像这样:

 - Parent
  - id: 1
  - name: "ParentName1"
  - children: 
     - child
         -  cid: 1
         -  name: "ChildName1"
         -  movies: 
              - Movie
                 - mid: 1
                 - name: "MovieName1"
              - Movie
                 - mid: 2
                 - name: "MovieName2"
     - child
         -  cid: 2
         -  name: "ChildName2"
         -  movies: 
              - Movie
                 - mid: 3
                 - name: "MovieName3"
              - Movie
                 - mid: 1
                 - name: "MovieName1"
 - Parent
  - id: 2
  - name: "ParentName2"
  - children: 
     - child
         -  cid: 4
         -  name: "ChildName4"
         -  movies: 
              - Movie
                 - mid: 6
                 - name: "MovieName6"
              - Movie
                 - mid: 7
                 - name: "MovieName7"
      - child
         -  cid: 1
         -  name: "ChildName1"
         -  movies: 
              - Movie
                 - mid: 1
                 - name: "MovieName1"
              - Movie
                 - mid: 2
                 - name: "MovieName2"

我创建了一个查询,它将所有子ID,名称和电影连接成用“,”分隔的单行。这适用于ids和名字,但对电影来说很棘手。

SELECT 
        parents.id AS parentId,
        parents.name AS parentName,
        GROUP_CONCAT(children.id) AS childrenIds,
        GROUP_CONCAT(children.name) AS childrenNames,
        GROUP_CONCAT(children.movies) AS childrenMovies
    FROM
        parents
    LEFT JOIN relationTable ON
        relationTable.pid = parent.id
    LEFT JOIN children ON
        children.id = relationTable.child.id
    LEFT JOIN moviesRelatonTable ON
        moviesRelatonTable.personId = children.id
    GROUP BY 
        parents.id

我想我只能查询父母,然后在PHP中循环查看每个父母并获得孩子。但我觉得这对表现来说并不好。


有没有更好的方法可以查询,或者我应该使用PHP中的循环?

1 个答案:

答案 0 :(得分:-1)

如果您始终从数据库中提取完整列表,则可以在处理一次后将json保存为文件。在每个请求检查文件保存日期和最后更新的数据库中,如果json文件是最新的,甚至不用把它全部拉出数据库,只需使用该文件。如果文件不是最新的,请从db创建它并再次保存。这将有助于解决性能问题,然后您不必太担心子查询性能。您需要使用函数file_existsfilemtime