更快/更容易地查询此结果数组

时间:2012-05-01 12:14:27

标签: php mysql arrays left-join

我正在尝试获取包含三个表中信息的数组。结果应该是一个数组,我可以循环遍历第一个表,它的相关行来自第二个表,再次是相关的行,从第三个表到第二个表。目前,我有三个单独的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 

希望有人可以在这里帮助我,或者让我朝着正确的方向前进 - 或者甚至想出更好的主意。

2 个答案:

答案 0 :(得分: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记录,是吗?性能将是可怕的,只有少数用户会崩溃您的服务器。

您应该重新考虑您真正需要的数据以及使用方式。

你想做什么?你需要什么数据?如何从数据库服务器获取它?

答案 1 :(得分: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

然后去循环。 <{1}}和group_course_id将在ON条件中使用。

这将为您提供结果,但您仍然需要为所需结果创建一个循环。

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

修改

使用此功能创建阵列:

user_group_id

我使用mysql扩展,如果你使用任何其他扩展,那么相应地编辑它