0

我正在尝试获取一个包含来自三个表的信息的数组。结果应该是一个数组,我可以在其中循环遍历第一个表、第二个表的相关行以及第三个到第二个的相关行。目前,我有三个单独的 SQL 查询,然后将它们重组为一个数组。

也许有人可以帮助我了解查询这些表以获取以下数组的最佳方法。我目前有三个查询 - 每个表一个。使用 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 数组中。根据您的评论,您一次需要一个月,因此添加一个 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 条目?您不会在单个页面上显示 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

然后去循环。group_course_id并且user_group_id将在 ON 条件下使用。

这会给你结果,但你仍然必须为所需的结果创建一个循环。

等待我的回复让循环用于创建上述数组。

编辑:

使用此函数创建数组:

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 回答