JOIN users S on S.id=IF(93=sender_id, sender_id, recipient_id)
JOIN users R on R.id=IF(93=recipient_id, sender_id, recipient_id)
По-моему первый IF всегда будет давать 93 и в нем нет смысла.
Проверьте план запроса, почему-то мне кажется, что оптимизатор будет некорректно анализировать неоднозначные условия соединения, из-за того что в разных ситуациях нужно выбирать разные индексы, он скорее всего предпочтет full scan. Но надо проверить.
Я бы все-таки соединял по однозначному условию, а уже вывод делал условным, через CASE.