哪个更有效:SQL JOIN还是嵌套的PHP循环?

Ora*_*s13 2 php sql join while-loop nested-loops

我有几个表,我需要从中显示数据.

Schools
-------
id | Title

Programs
--------
id | descr | title | type | school.id
Run Code Online (Sandbox Code Playgroud)

当然,不是最好的设置,但我没有任何关于数据库结构的事情.

我需要创建一个列表,按学校,程序和程序类型分隔.现在,我有一个巨大的嵌套循环(伪代码):

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;
Run Code Online (Sandbox Code Playgroud)

不用说它一团糟.

最终结果是一个列表:

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

有没有办法用更少的查询和更少的数据库密集的代码来做到这一点?

Chr*_*ain 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
Run Code Online (Sandbox Code Playgroud)

这将为您提供大矩形数组,按优先级顺序按每个标题排序.这样,您可以循环遍历行,直到您看到学校标题更改,或程序类型标题更改,或其他任何内容,并呈现相应的结束标记.