簡體   English   中英

循環內的PHP查詢

[英]PHP queries inside loop

可以對數據庫運行多少個查詢。

  • 我在for循環中運行簡單的sql查詢。 估計在循環內運行的查詢數量為2000。
  • 它會影響我的表現嗎? 如果確實如此,則擴展到哪個范圍。

表A

 code name 1 abc 2 xyz 4 lol 6 lll 

表B

code      year    no
1         1990    406
6         2016    510
2         2017    777
6         2017    511
2         2016    777

我想在表格中顯示數據:

Name  1990  1991  1992  .............2017
abc    1      0     0                  0
xyz    0      0     0                  1

它會影響我的表現嗎? 如果確實如此,則擴展到哪個范圍。

是。 很難說使用2000個查詢會在多大程度上影響性能。 但是與執行1、2、20、200個查詢相比,它的性能明顯較差。

而且,如果不知道您正在運行哪些查詢,使用過的PHP循環或沒有更完整的數據集,就很難進一步建議您。

話雖這么說,使用2000個查詢(每年和一個代碼一次)是荒謬的,而且可以肯定地對其進行優化。 因此,我寫了以下內容:

該查詢假定對於給定的codeyeartable_b可能存在多個條目,因此,使用group bysum組合這些結果。

SELECT a.name, b.year, SUM(b.no) AS number
FROM table_a a
INNER JOIN table_b b ON (a.code = b.code)
GROUP BY a.code, b.year
ORDER BY b.year ASC, a.name ASC 

該查詢的輸出應為:

name      year      number
--------------------------
abc       1990      406
lll       2016      510
xyz       2016      777
lll       2017      511
xyz       2017      777

如果隨后要使用循環來重構數據,例如以下內容(盡管也可以使用forforeachwhile循環來完成,那么您將創建以下數據結構。

$data = array_reduce($results, function ($data, $result) {
    extract('result');
    $data[$name][$year] = $number;

    return $data;
}, []);

/*
$data = [
    'abc' => [
        1990 => 406,
    ],
    'lll' => [
        2016 => 510,
        2017 => 511,
    ],
    'xyz' => [
        2016 => 777,
        2017 => 777,
    ],
];
*/

由此,您可以輕松地遍歷數據結構以根據問題生成表布局。

如果您使用當前使用的代碼更新問題,那么我很可能會進一步完善該答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM