假设这些是您的表格:
CREATE TABLE movies
(
movie_id SERIAL PRIMARY KEY,
movie TEXT
) ;
CREATE TABLE comments
(
comment_id SERIAL PRIMARY KEY,
movie_id INTEGER NOT NULL REFERENCES movies(movie_id),
comment_date DATE NOT NULL DEFAULT current_date,
comment TEXT
) ;
CREATE TABLE reviews
(
review_id SERIAL PRIMARY KEY,
movie_id INTEGER NOT NULL REFERENCES movies(movie_id),
review_date DATE NOT NULL DEFAULT current_date,
review TEXT
) ;
以及他们的价值观:
INSERT INTO
movies
(movie)
VALUES
('2001 A Space Odissey'),
('Start Trek: The Wrath of Khan'),
('Start Trek Beyond'),
('The 39 steps');
INSERT INTO
comments
(movie_id, comment_date, comment)
VALUES
(1, current_date, 'Best film ever'),
(2, current_date+1, 'Not as good as 2001');
INSERT INTO reviews
(movie_id, review_date, review)
VALUES
(3, current_date, 'Not the best Start Trek film ever, however, the best CGI imaginable, ...') ;
实现您想要的更简单的方法是首先获取(所有)电影,以及 max(review_id)、max(comment_id),并按日期限制它们:
SELECT
m.movie_id, m.movie, max(r.review_id) AS review_id, max(c.comment_id) AS comment_id
FROM
movies m
LEFT JOIN reviews r ON (r.movie_id = m.movie_id AND r.review_date >= current_date)
LEFT JOIN comments c ON (c.movie_id = m.movie_id AND c.comment_date >= current_date)
GROUP BY
m.movie_id ;
电影ID |电影 | review_id | comment_id
--------: | :---------------------------- | --------: | ---------:
2 |开始迷航:可汗之怒 |
空 | 2
4 | 39 步 |
空 |
空
1 | 2001 太空奥德赛 |
空 | 1
3 |开始迷航超越 | 1 |
空
从之前的查询中,我们返回链接以获取其余的评论和评论数据:
SELECT
q.movie_id, q.movie, q.review_id, r2.review_date, r2.review, q.comment_id, c2.comment_date, c2.comment
FROM
(SELECT
m.movie_id, m.movie, max(r.review_id) AS review_id, max(c.comment_id) AS comment_id
FROM
movies m
LEFT JOIN reviews r ON (r.movie_id = m.movie_id AND r.review_date >= current_date)
LEFT JOIN comments c ON (c.movie_id = m.movie_id AND c.comment_date >= current_date)
GROUP BY
m.movie_id
HAVING
-- restrict to only movies with some recent comment or review
max(r.review_id) IS NOT NULL or max(comment_id) IS NOT NULL
) AS q
LEFT JOIN reviews r2 USING(review_id)
LEFT JOIN comments c2 USING(comment_id)
ORDER BY
movie_id ;
结果是:
电影ID |电影 | review_id |审查日期 |评论 |评论 ID |评论日期 |评论
--------: | :---------------------------- | --------: | :------------ | :------------------------------------------------- ---------------------- | ---------: | :----------- | :-----------------
1 | 2001 太空奥德赛 |
空 |
空 |
空 | 1 | 2017-07-30 |有史以来最好的电影
2 |开始迷航:可汗之怒 |
空 |
空 |
空 | 2 | 2017-07-31 |不如2001
3 |开始跋涉超越 | 1 | 2017-07-30 |不是最好的 Start Trek 电影,但是,最好的 CGI 可以想象,... |
空 |
空 |
空
您可以在 dbfiddle here
中测试所有这些
注意:老实说,我不知道如何将其反向翻译为 Eloquent。 ORM 适用于简单查询,但当事情变得有点复杂时,我更喜欢回到 SQL。