2015-10-15 6 views
-1

Могу ли я оптимизировать этот код?
mysqli_stmt_bind_param($statement, "iiiiiii", $user, $user, $user, $user, $user, $user, $user);PHP - то же значение в mysqli bind param

Используется для этого запроса:

$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

 Смежные вопросы

  • Нет связанных вопросов^_^