@mostblacker
Фрилансер

Как сделать MySQL запрос из запроса?

Всем привет! У меня довольно сложная задача, которой я уже сломал голову.

Есть таблица friends
id | friend_id | user_id
1 | 1 | 2
2 | 1 | 10
3 | 1 | 50

Есть таблица posts
id | user_id | text | type
1 | 1 | test | 1
2 | 10 | test | 1
3 | 50 | test | 1
4 | 1 | test | 4
5 | 2 | test | 1

Задача такая: Нужно вывести из таблицы post только те записи с user_id, user_id которых будет равен user_id или friend_id, в свою очередь user_id или friend_id должны соответствовать например '1'. И потом все это сгруппировать по post.id и отсортировать по post.id. При всем этом, вывести не больше 10 последних записей (последних по post.id).

Как я пытаюсь:
SELECT * FROM friends INNER JOIN posts ON (friends.user_id = '1' AND posts.user_id = friends.friend_id AND posts.type != '4') OR (friends.friend_id = '1' AND posts.user_id = friends.user_id AND posts.type != '4') OR (posts.user_id = '1' AND posts.type != '4') GROUP BY posts.id ORDER BY posts.id DESC LIMIT 0, 10

Работает как и нужно, но если в таблице post более 30 000 записей, то запрос очень долго выполняется. Чем записей в post больше, тем дольше.

Я более, чем уверен, что в запросе есть катастрофическая ошибка, из-за которой все так медленно работает. Кто-нибудь может помочь найти ошибку или может быть вообще предложить новый запрос? Буду максимально благодарен ♥
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
@galaxy
Непонятно, сколько user_id в среднем подходят под условие
user_id которых будет равен user_id или friend_id, в свою очередь user_id или friend_id должны соответствовать например '1'.

Мало знаю про оптимизитор в mysql, но не думаю, что он шибко умный, так что чем проще запрос, тем лучше. Попробуйте так как-нибудь:
SELECT id FROM posts
 WHERE user_id IN (
    SELECT '1'
     UNION
    SELECT user_id FROM friends WHERE friend_id = '1'
     UNION
    SELECT friend_id FROM friends WHERE user_id = '1'
)
ORDER BY id DESC LIMIT 0, 10


Ну и, конечно, индекс на posts.user_id должен быть.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы