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

データベース構造は正規化されています-これは正しく、変更しないでください。

ただし、SQLは、N +結合に対して非正規化または「フラット化された」データを返します。単一の結果セットで返すことができるのは、同種のレコードのセットのみです。(SQL Serverなどの一部のデータベースでは、XML生成をサポートすることで構造を返すことができます。)

PHPで目的の配列構造を取得するには、次のものが必要です。

  1. 個別のクエリ/結果セット(投稿に示されているように):ick!

    約1つのクエリ/オブジェクトがあります。理論上の限界は似ているかもしれませんが、実際の実装ははるかに効率が悪く、オーバーヘッドは単一のクエリよりもはるかに大きくなります。すべてのクエリには(少なくとも)ラウンドトリップペナルティが発生することに注意してください。そのため、これはスケーラブルではありませんが、データセットが小さい場合や「時間に依存しない」操作の場合は問題なく機能する可能性があります。

  2. 結果の構造を再正規化します。

    これは、C#/ LINQにあるように、「GroupBy」操作のサポートで行うのは非常に簡単です。PHP1でこれに[簡単に]どのようにアプローチするかはわかりません。これも完璧ではありませんが、グループ化にハッシュが使用されていると仮定すると、これはかなりうまくスケーリングできるはずです-間違いなく#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 に答える