1

问题

  1. 我应该如何进行查询以获得此结果?

  2. 我应该为数据库表使用不同的结构吗?

 

细节

我想从 3 个表中获取结果:

+------------------------------+-------------------+
| courses                      | id                | <-------+
|                              | name              |         |
|                              |                   |         |
+------------------------------+-------------------+         |
| sections                     | id                | <-------|----------+
|                              | course_id         | <- FK(courses.id)  |
|                              | name              |                    |
+------------------------------+-------------------|                    |
| resources                    | id                |                    |
|                              | section_id        | <- FK(sections.id)-+
|                              | name              |
+------------------------------+-------------------+

我想将结果存储在这样的 PHP 数组中:

Array
(
    [courses] => Array
        (
            [id] => 1
            [name] => course 1
            [sections] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [course_id] => 1
                            [name] => course 1 section 1
                            [resources] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 1
                                            [section_id] => 1
                                            [name] => resource 1
                                        )

                                )

                        )

                )

        )

)

编辑

我做了什么:

$cources = DB::query(Database::SELECT,
'select * from courses')->execute($db,false)[0];  // Get all courses as array

foreach($courses as &$course) {
    $sections = DB::query(Database::SELECT,
    'select * from sections where course_id = '.$courses['id']);

    $course['sections'] = $sections;

    foreach($course['sections'] as &&section) {
        $resources = DB::query(...); // Get array of resources
        $section['resources'] = $resources;
    }
}
4

4 回答 4

1

数据库结构已标准化 - 这是正确,不应更改。

但是,对于 N+ 连接,SQL 会返回去规范化或“扁平化”的数据:在单个结果集中只能返回一组同质记录。(某些数据库,如 SQL Server,允许通过支持 XML 生成来返回结构。)

要在 PHP 中获得所需的数组结构,需要:

  1. 单独的查询/结果集(如帖子所示):ick!

    大约会有一个查询/对象。虽然理论上的界限可能相似,但实际实现的效率会低得多,而且开销也会比单个查询多得多。请记住,每个查询都会(至少)产生往返惩罚 - 因此,这是不可扩展的,尽管它可能适用于较小的数据集或“时间不敏感”操作。

  2. 重新规范化得到的结构:

    对于 C#/LINQ 中的“Group By”操作的支持,这非常简单。我不确定如何在 PHP 1中[轻松] 解决这个问题。这也不是完美的,但假设散列用于分组,这应该能够很好地扩展 - 它肯定会比#1更好。

如果可能,请考虑以可以在当前问题/范围内使用“平面”结果的方式编写查询,而不是上述方法。也就是说,分析如何使用数组-然后围绕该问题编写查询。这通常是一种更好的方法,可以很好地扩展。


1与重新规范化数据相关,YMMV:

于 2013-03-02T22:44:25.697 回答
1

您无法从 mysql 获得多维结果。获取元素的查询应该是这样的:

select courses.id as coursesId,courses.name as coursesName,sections.id as sectionsId,sections.name as sectionsName,resources.id as resourcesId, resources.name as resourcesName
from courses
left join sections on courses.id=sections.course_id
left join resources on sections.id=resources.section_id;

但是它当然不会为您提供您喜欢的数组。

于 2013-03-02T22:44:44.293 回答
1

你可以试试这样的

SELECT * FROM (
select c.id, c.name from courses c
union
select s.id, r.name,s.course_ID from sections s
union
select r.id, r.name,r.section_ID from resources r
)
于 2013-03-02T22:45:33.870 回答
0
        if you are familiar with php then you can use this code i am writing only 2nd level you can write same way with third label
    $final=array();
           $c=-1;
           $cid=false;
           $cname=false;
           $query = "SELECT c.*,s.*,r.* FROM  courses AS c LEFT JOIN sections AS s ON c.id=s.course_id LEFT JOIN resources AS r ON r.section_id =s.id";
           $result=mysql_query($query, $this->con) or die(mysql_error());
           while($row=  mysql_fetch_array($result)){
               if($cid!=$row[2]){
                   $final['cources'][++$c]['id']=$cid=$row[0];
                   $final['cources'][$c]['name']=$cname=$row[1];
                   $s=-1;


               }
               $final['cources'][$c]['sections'][++$s]['id']=$row[2];
               $final['cources'][$c]['sections'][$s]['course_id']=$row[3];
              $final['cources'][$c]['sections'][$s]['name']=$row[4];
           }
           echo "<pre>";
           print_r($final);
           echo "</pre>";

//Outpur
Array
(
    [cources] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [name] => c1
                    [sections] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 1
                                    [course_id] => 1
                                    [name] => s1-1
                                )

                            [1] => Array
                                (
                                    [id] => 1
                                    [course_id] => 1
                                    [name] => s1-1
                                )

                        )

                )

            [1] => Array
                (
                    [id] => 2
                    [name] => c2
                    [sections] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 2
                                    [course_id] => 2
                                    [name] => s1-2
                                )

                        )

                )

        )

)
于 2013-03-02T23:57:12.000 回答