3 回答
TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊
對(duì)每條記錄進(jìn)行一次額外查詢(xún)是一個(gè)非常糟糕的主意,并且是N+1 問(wèn)題的一個(gè)明顯示例:您需要獲取實(shí)體的“N”個(gè)子實(shí)體,并且最初只獲取父實(shí)體。
如果您的初始查詢(xún)有 100 個(gè)用戶,那么您將完成 101 個(gè)查詢(xún)。如果您以后需要一些其他不相關(guān)的領(lǐng)域,這將開(kāi)始迅速失控。
這對(duì)性能非常不利,并且隨著您的應(yīng)用程序變得越來(lái)越復(fù)雜,它很容易對(duì)其產(chǎn)生非常嚴(yán)重的影響。
假設(shè)您無(wú)法修改初始查詢(xún)并進(jìn)行簡(jiǎn)單JOIN查詢(xún)以獲取所需數(shù)據(jù),最好簡(jiǎn)單地進(jìn)行兩次查詢(xún)并拼接結(jié)果數(shù)據(jù)。即使您可以修改原始查詢(xún),這最終可能會(huì)表現(xiàn)得更好。
如何去做:
假設(shè)您的初始對(duì)象數(shù)組具有 aformId和userId公共屬性,首先獲取您感興趣的所有用戶 ID:
$index = [];
$ids = array_reduce($array, function($ids, $object) use (&$index) {
$ids[] = $object->userId;
$index[$object->userId] = $object;
return $ids;
});
$ids_for_sql = '(' . implode(', ', $ids) . ')';
您還正在構(gòu)建一個(gè)“索引”( $index),以便能夠直接訪問(wèn)數(shù)組中的對(duì)象,而無(wú)需再次對(duì)其進(jìn)行迭代。
現(xiàn)在您可以進(jìn)行第二個(gè)查詢(xún)來(lái)獲取您的“組”屬性:
$groups_query = "SELECT userId, group from users WHERE userId IN $ids_for_sql";
現(xiàn)在只需“拼接”來(lái)自?xún)蓚€(gè)查詢(xún)的數(shù)據(jù)即可:
foreach ($conn->query($groups_query) as $row) {
$index[$row['userId']]->group = $row['group'];
}
有了這個(gè),現(xiàn)在您的原始$array包含“用戶”對(duì)象將被正確更新,并且只進(jìn)行 2 次查詢(xún)而不是 11 次。這可以更好地執(zhí)行和擴(kuò)展,并且不會(huì)增加顯著的復(fù)雜性。
您可以在這里看到一個(gè)簡(jiǎn)單的、有效的演示(使用數(shù)組而不是 SQL 查詢(xún))。
TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
首先,我們將從對(duì)象數(shù)組中獲取 userID 的值,然后在數(shù)據(jù)庫(kù)中查詢(xún)它,假設(shè)數(shù)組為 $arr。
foreach($arr AS $key=>$item)
{
$userid=$item["userId"]; // getting userId from object
$query= $con->query("SELECT group from users WHERE userId='$userid'");
if($query->num_rows>0) //checking if query has some result
{
$row=$result->fetch_assoc(); //fetching the result
$arr[$key]->group=$row['group']; // lastly attaching group key to the arr.
}
}
TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
您必須查找項(xiàng)目,從數(shù)組項(xiàng)目中獲取 ID,然后使用 SQL 選擇數(shù)據(jù)。
嘗試:
foreach($array as $key=>$item) {
$sql = "SELECT group from users WHERE userId = ".$item["userId"];
$result = $conn->query($sql);
if ($result->num_rows > 0) {
$db_data = $result->fetch_assoc();
//do stuff with db data
$array[$key]["group"] = $group; //insert group to this variable
}
}
- 3 回答
- 0 關(guān)注
- 200 瀏覽
添加回答
舉報(bào)
