我正在尝试获取包含三个表中信息的数组。结果应该是一个数组,我可以循环遍历第一个表,它的相关行来自第二个表,再次是相关的行,从第三个表到第二个表。目前,我有三个单独的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
希望有人可以在这里帮助我,或者让我朝着正确的方向前进 - 或者甚至想出更好的主意。
答案 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扩展,如果你使用任何其他扩展,那么相应地编辑它