После изучения размещенной вами схемы я использовал MySQL для создания базы данных и заполнения таблиц следующими примерами данных:
INSERT INTO users (uid, name) VALUES
('user1', 'user1 name'),
('user2', 'user2 name'),
('user3', 'user3 name'),
('user4', 'user4 name'),
('user5', 'user5 name');
INSERT INTO friends (uid, fid) VALUES
('user1', 'user2'), ('user1', 'user3'),
('user2', 'user4'), ('user2', 'user5');
INSERT INTO business (bid, name, city) VALUES
('b1', 'business 1', 'city 1'),
('b2', 'business 2', 'city 2'),
('b3', 'business 3', 'city 3'),
('b4', 'business 4', 'city 4');
INSERT INTO reviews (rid, bid, uid, stars, date, text) VALUES
('r1', 'b1', 'user1', 5, '2019-05-01', 'blah'),
('r2', 'b2', 'user1', 5, '2019-05-02', 'blah'),
('r3', 'b3', 'user1', 5, '2019-05-03', 'blah'),
('r4', 'b1', 'user2', 4, '2019-05-11', 'blah'),
('r5', 'b2', 'user3', 3, '2019-05-12', 'blah'),
('r6', 'b1', 'user4', 5, '2019-05-13', 'blah');
Это позволило мне проверить правильность исходного решения, которое я предложил, выполнив запрос в MySQL Workbench.
Я предполагаю, что упомянутое вами «неуспешное завершение» не имеет ничего общего с запросом как таковым, а скорее является временным сбоем используемого вами соединения с БД.
Обратите внимание, что код обновлен с учетом предложения Михаила Шишкова об использовании параметров.
-- Display review information originating from friends of user1
-- DECLARE @UID varchar(40); -- Uncomment for MS-SQL (variables need to be declared)
SET @UID = 'user1';
SELECT U.name, B.name, B.city, R.text, R.date
FROM business AS B
INNER JOIN reviews AS R ON B.bid = R.bid
INNER JOIN users AS U ON R.uid = U.uid
WHERE (R.date = (SELECT MAX(X.date) FROM reviews AS X WHERE (X.uid = R.uid)))
AND (R.uid IN (SELECT F.fid FROM friends AS F WHERE (F.uid = @UID)));
Исходя из примеров данных и использования ' user1 ' в качестве значения параметра @UID, результаты запроса:
name name city text date
------------------------------------------------
user2 name business 1 city 1 blah 2019-05-11
user3 name business 2 city 2 blah 2019-05-12
Более того, я предполагаю, что дружба - это двусторонние отношения в контексте вашей схемы (как в реальном мире), то есть дружба между 'user1' и 'user2' должна определяться только одной записью в таблица 'friends' со значениями ('user1', 'user2') и reverse ('user2', 'user1') не нужны.
Итак, для полноты вы можете использовать следующий запрос:
-- Display review information originating from friends of user2
SET @UID = 'user2';
SELECT U.name, B.name, B.city, R.text, R.date
FROM business AS B
INNER JOIN reviews AS R ON B.bid = R.bid
INNER JOIN users AS U ON R.uid = U.uid
WHERE (R.date = (SELECT MAX(X.date) FROM reviews AS X WHERE (X.uid = R.uid)))
AND (R.uid IN (SELECT F.fid FROM friends AS F WHERE (F.uid = @UID) UNION
SELECT F.uid FROM friends AS F WHERE (F.fid = @UID)));
Теперь, используя ' user2 ' в качестве значения параметра @UID и расширенной версии запроса, мы получаем следующие результаты:
name name city text date
------------------------------------------------
user1 name business 3 city 3 blah 2019-05-03
user4 name business 1 city 1 blah 2019-05-13
Буду признателен, если вы признаете ответ приемлемым.