Могу ли я оптимизировать этот код?
mysqli_stmt_bind_param($statement, "iiiiiii", $user, $user, $user, $user, $user, $user, $user);
Используется для этого запроса:
$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));
Я думаю, вы можете упростить это до этого:
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 != ?
Других решений пока нет …