2 回答

TA貢獻1818條經驗 獲得超3個贊
與 Miken32 的建議相呼應,使用 aJOIN
同時從兩個表中獲取數據,還使用ORDER BY school_number
. 然后,當您遍歷組合表時,請記?。ㄔ诰植孔兞恐校?code>school_number您看到的最新內容,這樣您就可以注意到值何時發生變化……當您從一所學校搬到另一所學校時。(如果你在“學校之間”做事,別忘了在循環結束后做最后一次......)
現在的查詢將需要更長的時間來執行(當然,無論如何您都應該teachers
通過...索引表school_number
),但它只會執行一次,并且會一次性為您提供所需的所有答案。
而且,是的,在編寫新查詢時使用“準備好的語句”:level
在這種情況下,只有一個參數。
不用說,如果您真的打算對“所有級別”執行此操作,只需忽略該測試,ORDER BY LEVEL, SCHOOL_NUMBER
并注意兩列值的變化。數據庫會很樂意一次性為您提供所需的所有信息。

TA貢獻1877條經驗 獲得超1個贊
準備好的語句有兩個優點。首先,用戶輸入被轉義以解決 SQL 注入的任何問題。其次,該語句可以準備一次但多次執行以減少開銷。您正在避免這兩個好處。
嘗試這樣的事情:
<?php
$level = $_GET['level'];
// we use a placeholder and pass the value to execute()
$sql = "SELECT school_number FROM schools WHERE level = ? ORDER BY school_number";
$stmt = $PDO->prepare($sql);
if($stmt->execute([$level])) {
$schools = $stmt->fetchAll(\PDO::FETCH_ASSOC);
$sql = "SELECT * FROM teachers WHERE school_number = ?";
// note statement is prepared outside the loop
$stmt2 = $PDO->prepare($sql);
foreach($schools as $school) {
if($stmt2->execute([$school["school_number"]])) {
while ($teachers = $stmt2->fetch()) {
//GENERATE XLSX FILE WITH DATA
}
}
}
}
雖然你可能會用 aJOIN來代替:
<?php
$level = $_GET['level'];
$sql = "SELECT teachers.* FROM teachers LEFT JOIN schools USING (school_number) WHERE schools.level = ?";
$stmt = $PDO->prepare($sql);
if($stmt->execute([$level])) {
while ($teachers = $stmt->fetch()) {
//GENERATE XLSX FILE WITH DATA
}
}
- 2 回答
- 0 關注
- 200 瀏覽
添加回答
舉報