2015-10-15 55 views
-1

我可以優化此代碼嗎?
mysqli_stmt_bind_param($statement, "iiiiiii", $user, $user, $user, $user, $user, $user, $user);PHP - 在mysqli綁定參數中的相同值

用於此請求:

$statement = mysqli_prepare($conn, "SELECT u_id, u_lastname, u_firstname, 
    (SELECT f_id from friend where (f_friend_one = u_id AND f_friend_two = ?) OR (f_friend_one = ? AND f_friend_two = u_id)), 
    (SELECT f_type from friend where (f_friend_one = u_id AND f_friend_two = ?) OR (f_friend_one = ? AND f_friend_two = u_id)) 
FROM user 
WHERE ((u_id = (SELECT f_friend_one FROM friend WHERE f_friend_one = u_id AND f_friend_two = ? AND (f_type = 1 OR f_type = 4))) 
OR  (u_id = (SELECT f_friend_two FROM friend WHERE f_friend_one = ? AND f_friend_two = u_id AND (f_type = 1 OR f_type = 3)))) 
AND  u_id != ? ") 
    or die(mysqli_error($conn)); 
+0

可能不會使運行時間有差別,但我敢肯定,你會縮短查詢,但是,因爲它沒有包括... – Devon

+0

查詢很可能被簡化成'JOIN'所以您不必重複所有這些查詢。我試圖弄清楚它在做什麼。 – Barmar

+0

查詢獲取朋友信息,如果他們是朋友:我有一個有三列的朋友表:id,f_friend_one(發送邀請的用戶),f_friend_two。 – Okn

回答

2

我想你可以把它簡化爲這樣:

SELECT u_id, u_lastname, f_id, f_type 
FROM user 
JOIN friend 
    ON (u_id = f_friend_one AND f_friend_two = ? AND f_type IN (1, 4)) 
     OR 
     (u_id = f_friend_two AND f_friend_one = ? AND f_type IN (1, 3)) 
WHERE u_id != ? 

這有可能是不需要在年底WHERE條款,因爲有人不能向朋友發送好友請求。

OR可能會讓MySQL難以優化,所以最好將它分成兩個子查詢連接UNION

SELECT u_id, u_lastname, f_id, f_type 
FROM user 
JOIN friend ON u_id = f_friend_one 
WHERE f_friend_two = ? AND f_type IN (1, 4)) 
    AND u_id != ? 

UNION 

SELECT u_id, u_lastname, f_id, f_type 
FROM user 
JOIN friend ON u_id = f_friend_two 
WHERE f_friend_one = ? AND f_type IN (1, 3)) 
    AND u_id != ? 
+0

謝謝,工作很好! – Okn

相關問題