具有数组处理或多个查询的大SQL查询?最佳做法

时间:2013-10-15 12:17:06

标签: php sql-server arrays

我有一个纵向数据的大型数据库(MS SQL Server),我正在查询以获取要在我的Web应用程序中显示的信息(PHP驱动)。该数据库包含多年来许多高等教育课程的记录......但有时候,给定年份/课程组合没有可显示的数据。如果有人在没有专门选择一年的情况下点击Web应用程序,我希望应用程序自动选择要显示最多可用数据的年份。

所以,这是我的问题......我应该查询数据库一次以获取所有年份的所有可用信息,然后在PHP中循环返回的数组以确定哪些年份具有最佳数据?或者更好的是执行类似下面的内容,然后选择最佳的数据年份,然后运行第二个SQL查询?

SELECT ProgYear, SUM(CASE WHEN WageDisp>0 THEN 1 ELSE 0 END) as WageCount,
                SUM(CASE WHEN UNCDisp>0 THEN 1 ELSE 0 END) as UNCCount,
                SUM(CASE WHEN CurrDisp>0 THEN 1 ELSE 0 END) as CurrCount,
                SUM(CASE WHEN ConEdDisp>0 THEN 1 ELSE 0 END) as ConEdCount
            FROM    (SELECT ProgID, ProgYear, SUM(CASE WHEN MAX(NumWage0, NumWage1, NumWage2, NumWage3, NumWage4, NumWage5, NumWage6, NumWage7, NumWage8)>0 THEN 1 ELSE 0 END) as WageDisp,
                        SUM(CASE WHEN MAX(UNC0, UNC1, UNC2, UNC3, UNC4, UNC5, UNC6, UNC7, UNC8)>0 THEN 1 ELSE 0 END) as UNCDisp,
                        SUM(CASE WHEN MAX(Curr0, Curr1, Curr2, Curr3, Curr4, Curr5, Curr6, Curr7, Curr8)>0 THEN 1 ELSE 0 END) as CurrDisp,
                        SUM(CASE WHEN MAX(ConEd0, ConEd1, ConEd2, ConEd3, ConEd4, ConEd5, ConEd6, ConEd7, ConEd8)>0 THEN 1 ELSE 0 END) as ConEdDisp)
            WHERE ProgID in (SELECT item from fnSplit(?, '|'))

PHP应用程序将在本地主机上访问SQL Server,因此数据的传输时间应该非常短。只是想知道提示/最佳实践。

谢谢!

1 个答案:

答案 0 :(得分:1)

经过深思熟虑的SQL语句基本上总是比通过大型数组排序以找到最佳数据更好。我想知道您的查询是否有效(如果是,那么我想知道您的数据库是否最佳)

但是,理想情况下,您将拥有一个包含汇总数据缓存的表,您可以从中快速检索此类汇总信息。根据原始数据更改的频率,这需要每隔一段时间更新摘要数据(例如,更新原始数据时)。