哪个更高效:SQL JOIN或嵌套的PHP循环


Which is more efficient: a SQL JOIN or nested PHP loop?

我有几个表需要显示其中的数据。

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;

不用说,这里一团糟。

最终结果是一个列表:

  • 程序1
    • 程序类型1
      • 程序
      • 程序
    • 程序类型2
      • 程序
      • 程序
    • 程序类型3
      • 程序

有没有一种方法可以用更少的查询和更少的代码来做到这一点,而不是数据库密集型的?

这里真正的问题不在于一种或另一种编程语言是否更高效。性能上的巨大差异是由于数据的局部性,即在数据库上执行查询本身不需要在网络上来回移动所有数据进行评估,而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

这将为您提供一个大的矩形数组,按每个标题的优先级顺序排列。通过这种方式,您可以循环浏览行,直到看到学校标题更改或程序类型标题更改或其他更改,并呈现相应的结束标记。

MSSQL将做得更好。RDBMS就是这样设计来处理这类事情的。如果您在数据库服务器上执行这些操作,则可以节省网络利用率。

MSSQL用于执行联接。此外,如果运气好的话,您的表可能会被索引,这将进一步提高性能。

运行一个复杂的查询(很可能(总是比用php遍历所有数据要好。

编辑:

也许您可以使用别名来标记数据的结构
示例:SELECT id as test_id .... SELECT program as test_test2_program...

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代码,并且可以通过保存数据库往返、在线数据以及让数据库优化器完成它的工作来显著优于它。