2015-09-13 25 views
0
$id = $user['id']; // the ID of the logged in user, we are retrieving his friends 
$friends = $db->query("SELECT * FROM friend_requests WHERE accepted='1' AND (user1='".$id."' OR user2='".$id."') ORDER BY id DESC"); 

while($friend = $friends->fetch_array()) { 
    $fr = $db->query("SELECT id,profile_picture,age,full_name,last_active FROM users WHERE (id='".$friend['user1']."' OR id='".$friend['user2']."') AND id != '".$id."'")->fetch_array(); 
    echo $fr['age'];  
} 

我基本上循環所有的朋友,並獲得有關每個人的信息。如何使用SQL查詢優化while循環?

我以前會如何優化它,我知道這麼多次運行這個查詢效率低下,考慮到成千上萬的「朋友」,但我不確定如何去優化它。任何幫助表示讚賞,謝謝。

+0

並且是什麼的問題;速度? –

+0

是的,速度是一個很大的問題,因爲有很多用戶。 –

+0

先運行你的選擇,然後做你的循環,並確保你的表正確索引。你也可以看看分頁和LIMIT等等。我也不知道你爲什麼使用'fetch_array()'兩次。 –

回答

0

該評論中的文章很棒。你一定會想知道如何自己編寫連接。這是我爲你寫的。當你重寫查詢時,你可能不想*來自friend_requests的列(或者因爲你打算使用join)。你拉的任何列都必須加載到內存中,這樣任何你可以避免拉動的東西都會有幫助。特別是如果你是PHP服務器和你的數據庫服務器不在同一臺機器上(通過網絡的數據較少)。

無論如何,這是我瞎猜:

$id = $user['id']; 

$friends = $db->prepare(" 
    SELECT 
     freq.* 
     ,users.id AS users_id 
     ,users.profile_picture 
     ,users.age 
     ,users.full_name 
     ,users.last_active 
    FROM friend_requests freq 
    INNER JOIN users u ON users.id IN (freq.user1,freq.user2) AND freq.id != u.id 
    WHERE 
     freq.accepted='1' 
     AND ? IN (freq.user1,freq.user2 
    ORDER BY freq.id DESC"); 
if($friends) { 

    $friends->bindParam("s",$id); 

    if($friends->execute()) { 
     // get_result() only works if you have the MySQL native driver. 
     // You'll find out real quick if you don't 
     $myFriends = $friends->get_result(); 

     while($row = $myFriends->fetch_assoc()) { 
      echo $row['age'];  
     } 
    } 
} 
else { 
    printf("SQL Error: %s.<br>\n", $friends->error); 
} 
// cleanup 
$friends->close(); 

快速參考:get_result()

+0

一個好的鏡頭。請注意,$ id不需要加標點 - 但應該重寫$以利用預準備的語句語法,數字值不需要也不應該被引用。 – Strawberry

+0

@Strawberry已經有一段時間了,因爲我使用mysqli所以,如果您檢出編輯,我會很感激 – Terminus