2011-06-27 76 views
1

我在foreach循環中有一個SQL查詢。有時可能會有很多,我的意思是要做很多查詢,具體取決於多個標準,最多可能有78個查詢。優化此SQL查詢

現在,我知道過早優化是所有邪惡的根本原因,但我不想看到78個查詢 - 這只是不健康。

下面的代碼:

$crumbs = explode(",", $user['data']['depts']); 

foreach ($crumbs as &$value) { 
    $data = $db->query("SELECT id FROM tbl_depts WHERE id = '" . $value . "'"); 
    $crumb = $data->fetch_assoc(); 
    $dsn = $db->query("SELECT msg, datetime FROM tbl_motd WHERE deptid = '" . $value . "'"); 
    $motd = $dsn->fetch_assoc(); 
    if ($motd['msg'] != "") { 
     <?php echo $motd['msg']; ?> 
    } 
} 

我可以使它更好嗎?

+0

除了下面的優化之外,您可能還想考慮將其設置爲存儲過程,而不是直接選擇以提高性能。 – nickytonline

+0

請注意,此代碼易受SQL注入攻擊。 –

+0

你好Daniel,爲什麼會這樣?數據只是獲得一個數組,在投入之前已經過數據處理。在此代碼之前,Aldo,$ user ['data']及其子代也將被清理。 – bear

回答

1

使用IN MySQL operator搜索在一組值的id

$ids = '"' . implode('", "',$crumbs) . '"'; 
$query1 = "SELECT id FROM tbl_depts WHERE id IN (" . $ids . ")"; 
$query2 = "SELECT msg, datetime FROM tbl_motd WHERE deptid IN (" . $ids . ")"; 

所以你不會需要檢索需要使用foreach循環中的所有數據,所以你將有隻有2個查詢,而不是的78.

例如:我有一個名爲table的表,其中有10個記錄,它們是:1,2,3,4,5,6,7,8,9,10(自動遞增)。我知道我需要記錄1,5,8。我的查詢將是:

$sql = "SELECT * FROM `table` WHERE id in (1,5,8);"; 

而且我不明白爲什麼你需要使用&運營商foreach循環,如果你不修改$crubms陣列值。

+0

所以我會用這個替換上面的兩個查詢,但重寫代碼本身? – bear

+0

這只是我把&運營商的習慣。 – bear

+0

@Shamil,是的。由於使用其他方法,您將不得不重寫代碼。 – Nemoden

1

我認爲這是你想要的。

SELECT msg, datetime 
FROM tbl_depts td 
INNER JOIN tbl_motd tm ON td.id = tm.deptid 
+0

哪一個應該替換它? – bear

+0

我沒有真正查看查詢的邏輯,但我認爲你已經在某處忘記了WHERE。我認爲OP的查詢結果受到一組特定ID的限制。應該是'INNER JOIN tbl_motd tm ON td.id = tm.deptid WHERE td.id in()',可能嗎? – Nemoden

+0

是的。我忘了那裏。你是正確的 –