php - 更快/更轻松地查询此结果数组

标签 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 

希望有人可以在这里帮助我,或者让我走上正确的方向 - 甚至想出一个更好的主意。

最佳答案

正如您在答案中看到的那样,有多种方法可以执行该查询,但您永远不应该将整个数据库加载到 PHP 数组中。根据您的评论,您一次需要一个月,因此添加一个 WHERE 子句将结果限制为您想要的月份。

例如:

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

这将为您提供过去 30 天的信息。

或者,您可以使用 LIMIT 一次仅显示一定数量的记录:

LIMIT 0, 100

将为您提供从偏移量 0 开始的 100 条记录(前 100 条记录)。它使分页变得更容易。

如果您想首先获得最新的类(class),请使用 ORDER BY:

ORDER BY course.course_date DESC
LIMIT 0, 100

然后,您只需更改每个查询的限制即可获取下一批要显示的记录,当然,您的查询将非常快并且占用很少的内存,因为您下载的记录永远不会超过 100 条。

<小时/>

抱歉,听起来您正在用 PHP 进行数据库工作。

到底为什么要在 PHP 数组中加载 254k 条目?您不会在单个页面上显示 254k 条记录,是吗?性能将是可怕的,只有少数用户就会使您的服务器崩溃。

您确实应该重新考虑您真正需要哪些数据以及如何使用它们。

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

关于php - 更快/更轻松地查询此结果数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10397505/

相关文章:

mysql - 如何使用 Google BigQuery 按时间间隔分组

php - 在数据库中存储数据库密码

arrays - 从 CATEGORY 和 MONTH 获取 SUM

python - 基于第一行合并多维 NumPy 数组

php - 通过 POST 方法提交 HTML 表单时未定义索引

javascript - AJAX 延迟下一行的执行

mysql - Heroku 中的 unix_socket 路径?

python - 基于子数组的第二个元素对多维数组进行排序

php - 用php创建css文件

php - 拉拉维尔。如何按一个字段排序但首先获取具有另一个字段特定值的项目?