我有几个表,我需要从中显示数据。
Schools
-------
id | Title
Programs
--------
id | descr | title | type | school.id
当然,不是最好的设置,但我无法对数据库结构做任何事情。
我需要创建一个列表,按学校,程序和程序类型分隔。现在,我有一个巨大的嵌套循环(伪代码):
Select * from Schools
For Each School
print $school_header;
Select Program Type from Programs WHERE School.id = $school_id
For Each Program type
print $type_header;
Select * from Programs where School.id = $school_id and type = $program_type
For Each Program
print $program_link;
毋庸置疑,这是个烂摊子。
最终结果是一个清单:
有没有办法用更少的查询和更少的数据库密集的代码来执行此操作?
答案 0 :(得分:5)
这里真正的问题不是一种或另一种编程语言是否更有效。性能的巨大差异是由数据局部性造成的,即在数据库上执行查询本身并不需要您通过线路来回移动所有数据以进行评估,而PHP解决方案则需要。
对于您的查询,您要做的是编写一个存储过程,它返回多个结果集(用于进一步加入PHP)或单个大型结果集(通过加入SQL)。我的猜测是它看起来像:
SELECT S.Title as School_Title, pt.title as Program_type_title, p.title as Program_Title
FROM School S
INNER JOIN ProgramType pt on s.id = pt.school_id
INNER JOIN Program p on pt.id = p.program_type_id
ORDER BY S.Title, pt.title, p.title
这将为您提供大型矩形数组,按优先级顺序按每个标题排序。这样,您可以循环遍历行,直到您看到学校标题更改,或程序类型标题更改,或其他任何内容,并呈现相应的结束标记。
答案 1 :(得分:3)
MSSQL会做得更好。它是如何设计RDBMS来处理这类事情的。如果您在数据库服务器上执行这些操作,则可以节省网络利用率。
答案 2 :(得分:1)
MSSQL用于执行连接。此外,运气不错,您的表可能会被索引,这将进一步提高性能。
运行复杂的查询总是(很可能)总是比使用php循环所有数据更好。
编辑:
也许您可以使用别名来标记数据的结构
示例:SELECT id as test_id .... SELECT program as test_test2_program...
等。
答案 3 :(得分:0)
SELECT *
FROM Schools
INNER JOIN Programs
ON Programs."school.id" = Schools.id
INNER JOIN Groups
ON Groups."programs.id" = Programs.id
INNER JOIN GroupsToCourses
ON GroupsToCourses.group_id = Groups.id
INNER JOIN Courses
ON Courses.course_id = GroupsToCourses.course_id
它几乎肯定会超越PHP中的代码,并且可以通过保存数据库往返,线上数据以及让数据库优化器完成它来显着地超越它。