то же значение в mysqli bind param

Могу ли я оптимизировать этот код?
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));

-1

Решение

Я думаю, вы можете упростить это до этого:

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 != ?
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]