有一个新闻表和一个评论表。我需要从 News 表中获取 10 篇最新的新闻文章,并加入他们并对该文章发表 1 条最新评论。
数据库结构和到目前为止我尝试过的内容在这里:
CREATE TABLE News (newsId INT AUTO_INCREMENT, text VARCHAR(1000), date DATETIME, PRIMARY KEY(newsId));
CREATE TABLE Comments (commentId INT AUTO_INCREMENT, text VARCHAR(1000), date DATE, newsId INT, PRIMARY KEY (commentId));
INSERT INTO News (newsId, text, date) VALUES
(NULL, "1st random text", NOW()), (NULL, "2nd random text", NOW()), (NULL, "3rd NEWS text", '2017-10-10 15:30:00'),
(NULL, "4th random text", '2017-10-10 15:35:00'), (NULL, "5th random text", '2017-10-10 15:32:00'),
(NULL, "6th random text", '2017-10-10 15:34:00'), (NULL, "7th random text", '2017-10-10 15:31:00');
INSERT INTO Comments (commentId, text, date, newsId) VALUES
(NULL, "1st random comment", NOW(), 1), (NULL, "2nd random comment", '2017-10-10 15:34:00' , 1), (NULL, "3rd NEWS comment", NOW(), 2),
(NULL, "4th random comment", '2017-10-10 15:39:00', 2), (NULL, "5th random comment", '2017-10-10 23:34:00',3),
(NULL, "6th random comment", NOW(),3), (NULL, "7th random comment", NOW(),4);
SELECT N.*, C.*
FROM News N((
ORDER BY N.date DESC
LIMIT 10)
LEFT JOIN Comments C
ON C.newsId = N.newsId
ORDER BY C.date DESC
LIMIT 1);
但是这不起作用并抛出一个语法错误。不知道我怎么写这个。另外,我更喜欢没有子查询的建议,在此先感谢。
编辑。我得到的错误
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to use near '((
ORDER BY N.date DESC
LIMIT 10)
LEFT JOIN Comments C
ON C.newsId = N.n' at line 2
最佳答案
这是否解决了您的问题?
SELECT N.*, P.*
FROM News N
LEFT JOIN (SELECT c.* FROM Comments C
LEFT JOIN Comments c1 ON(c.newsId = c1.newsId and c1.date > c.date)
WHERE c1.date IS NULL) p
ON (p.newsId = N.newsId)
ORDER BY N.date DESC
LIMIT 10;
您的代码存在不止 1 个问题。首先,第一个 ORDER BY
子句是错误的。 Order by 出现在查询的末尾,你不能打开括号,因为优化器认为你启动了一个子查询。
其次,“我想要每个帖子的最新评论”,这意味着您需要最新的per 组。许多 RDBMS 提供像 row_number()
这样的窗口函数来解决这个问题。不幸的是,这是 MySQL,这意味着您要么必须进行自连接(查看我的内部查询),要么使用某种相关查询。
关于MySQL连接两个表并对它们进行限制和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46811887/