Вы действительно должны дать некоторое представление о том, как выглядит схема, чтобы нам не приходилось делать так много предположений. Я предполагаю, что первичный ключ user
равен id
, а friends
имеет поле userid
, а также поле friendid
. Я также предполагаю, что posts.currentuserid
- это идентификатор пользователя, который создал сообщение. Если нет, замените его на posts.userid
или на любое другое правильное поле.
Причина, по которой ваш запрос работает некорректно, заключается в том, что вам нужно как минимум 2 объединения. При создании запроса проще всего начать с того, что у вас есть, и перейти к тому, что вы хотите, по одному соединению за раз. Вот запрос для получения сообщений, которые может прочитать конкретный пользователь:
SELECT p.*
FROM user u
JOIN friends f ON u.id = f.userid
JOIN posts p ON ((u.id = p.currentuserid) OR (f.friendid = p.currentuserid AND p.time >= f.friend_since))
WHERE u.id = ?
ORDER BY p.postid DESC LIMIT 20
Второе соединение - это место, где мясо. В нем указано, что для того, чтобы прочитать сообщение, оно (а) должно быть написано вами или (б) написано вашим другом ПОСЛЕ того, как вы подружились с ним.
Если вы также хотите получить имя пользователя, который создал пост (при условии, что user.name
содержит имя пользователя), вам нужно 3-е объединение:
SELECT pu.name as 'Posted By', p.*
FROM user u
JOIN friends f ON u.id = f.userid
JOIN posts p ON ((u.id = p.currentuserid) OR (f.friendid = p.currentuserid AND p.time >= f.friend_since))
JOIN user pu ON p.currentuserid = pu.id
WHERE u.id = ?
ORDER BY p.postid DESC LIMIT 20