0

3つのテーブルからの情報を含む配列を取得しようとしています。結果は、最初のテーブル、2番目のテーブルからの関連する行、および3番目から2番目のテーブルまでの関連する行をループできる配列になるはずです。現在、3つの個別のSQLクエリがあり、それらは1つの単一の配列に再編成されます。

たぶん誰かがそれらのテーブルをクエリして以下の配列を取得するための最良の方法のアイデアを手伝ってくれるでしょう。現在、テーブルごとに1つずつ、合計3つのクエリを取得しています。mysql JOINを使用すると、非常に簡単なクエリですが、配列に戻すのに問題があります。

mysql JOINを使用して、より少ないクエリで同じ結果を取得することを考えていますが、実際には、それが非常に優れているのか、それとも可能であるのか疑問に思っています。テーブルのおおよそのサイズに数字を追加します。

詳細をお伝えします。

テーブル

courses(4000 rows)
course_id----course_date

groups(50 000 rows)
group_id----group_size----group_course_id

users(200 000 rows)
user_id----user_name----user_group_id

目的の配列の例:

[0] => Array('courseinfo' => 
              Array('course_id' => 1234,
                    'course_date' => '2012-08-12')
             'groups' =>
              Array( [0] => Array('group_id' => 345,
                                  'group_size' => 3,
                                  'group_course_id' => 1234,
                                  'users' => Array([0] => Array('user_id' => 456,'user_name' => Pete Cabrinha, 'user_group_id = '345'), 
                                                   [1] => Array('user_id' => 336,'user_name' => John Smith, 'user_group_id = '345'))
                     [1] => Array('group_id' => 345,
                                  'group_size' => 3,
                                  'group_course_id' => 1234,
                                   'users' => Array([0] => Array('user_id' => 456,'user_name' => Pete Cabrinha, 'user_group_id = '1234'), 
                                                    [1] => Array('user_id' => 336,'user_name' => John Smith, 'user_group_id = '1234'))))

それほど複雑ではないことを願っています。course_idとgroup_course_idの関係、およびgroup_idとuser_group_idの関係に注意してください。

現時点でクエリを実行する方法のスニペットを次に示します。

    $data = $courses = $read->read_courses();
    $i = 0;
    foreach($courses as $course)
    {
        if($data[$i]['groups'] = $read->read_groups($course['course_id']))
        {
            $j = 0;
            foreach($data[$i]['groups'] as $group)
            {
                $data[$i]['groups'][$j]['users'] = $read->read_users($group['group_id']);
                $j++;
            }
        }
        else {$data[$i]['groups'][0] = array(); $data[$i]['groups'][0]['users'] = array();}
        $i++;
    }

そして最後に、私が使用しようと思ったJOIN ...

        SELECT 
            course.course_id,
            course.course_date,

            groups.group_id,
            groups.group_course_id,
            groups.group_size,

            user.user_name


        FROM course
        LEFT JOIN groups 
        ON course.course_id = groups.group_course_id

        LEFT JOIN user
        ON groups.group_id = user.user_group 

誰かがここで私を助けてくれるか、私を正しい方向に導いてくれることを願っています-あるいはもっと良いアイデアを思いつくことさえできます。

4

2 に答える 2

1

回答でわかるように、そのクエリを実行するにはいくつかの方法がありますが、データベース全体を PHP 配列にロードしないでください。あなたのコメントによると、一度に 1 か月が必要なので、WHERE 句を追加して、結果を必要な月に制限します。

例えば:

SELECT ...
FROM ...
WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;

これにより、過去 30 日間が表示されます。

または、LIMIT を使用して、一度に特定の数のレコードのみを表示できます。

LIMIT 0, 100

オフセット 0 (最初の 100 レコード) から始まる 100 レコードが得られます。ページネーションがしやすくなります。

最新のコースを最初に取得したい場合は、ORDER BY を使用します。

ORDER BY course.course_date DESC
LIMIT 0, 100

次に、表示するレコードの次のバッチを取得するために各クエリの制限を変更するだけで済みます。もちろん、100 を超えるレコードをダウンロードすることはないため、クエリは非常に高速でメモリをほとんど使用しません。


申し訳ありませんが、データベースの作業を PHP で行っているようです。

なぜPHP配列に254kのエントリをロードするのでしょうか? 1 ページに 254k のレコードを表示するつもりはありませんよね? パフォーマンスは恐ろしく、ほんの一握りのユーザーでサーバーがクラッシュします。

本当に必要なデータとその使用方法を再考する必要があります。

あなたは何をしようとしているのですか?どのようなデータが必要ですか? データベースサーバーからどのように取得できますか?

于 2012-05-01T12:37:56.527 に答える
0

むしろこれを使え

    SELECT *
    FROM bs_course course 

    LEFT JOIN bs_group AS groups 
    ON course.course_id = groups.group_course_id

    LEFT JOIN bs_user AS user 
    ON groups.group_id = user.user_group_id

    ORDER BY course.course_date,course.course_lock,course.course_name,groups.group_status,groups.group_created

次に、ループに進みます。ON状態で使用しますgroup_course_iduser_group_id

これにより結果が得られますが、必要な結果を得るにはループを作成する必要があります。

上記の配列を作成するためにループを使用するための私の返信を待ちます。

編集:

この関数を使用して配列を作成します。

function create_array($resultset){
    if(!$resultset){return NULL;}

    $current_cid=0;
    $current_cid_counter = 0;
    $current_gid=0;
    $current_gid_counter = 0;
    $current_uid_counter = 0;
    $return_array = array();

    while($row = mysql_fetch_assoc($resultset)){
        if($current_cid!=$row['course_id']){
            $return_array[$current_cid_counter++]['courseinfo'] = array('course_id'=>$row['course_id'],'course_date'=>$row['course_date']);
            $current_cid = $row['course_id'];
            $current_gid_counter = 0;
            $current_uid_counter = 0;
        }
        if($current_gid!=$row['group_id']){
            $return_array[$current_cid_counter-1]['groups'][$current_gid_counter++] = array('group_id' => $row['group_id'],'group_size' => $row['group_size'],'group_course_id' => $row['course_id']);
            $current_gid = $row['group_id'];
            $current_uid_counter = 0;
        }
        $return_array[$current_cid_counter-1]['groups'][$current_gid_counter-1]['users'][$current_uid_counter++] = array('user_id' => $row['user_id'],'user_name' => $row['user_name'], 'user_group_id' => $row['group_id']);
    }

    return $return_array;
}

私はmysql拡張機能を使用しています。他の拡張機能を使用している場合は、それに応じて編集してください

于 2012-05-01T12:21:52.707 に答える