MySQL连接两个表并对它们进行限制和排序

标签 mysql

有一个新闻表和一个评论表。我需要从 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/

相关文章:

php - 如何将 SQL 查询放入 for() 循环中

php - 使用 API Rest 和双重 mysql 身份验证创建 Angular 应用程序

javascript - 数据库生成的下拉列表在选择时为更多变量提供来自同一数据库的值

MySQL - 错误的值

php - 从点击的按钮获取 URL

mysql - 如何在选择时重命名表的所有列?

php - 将天数添加到日期 php 对象,然后验证它是否在 2 个日期对象之间

mysql - 从同一张表中获取合并的计数

php - 将数组中的随机值设置到数据库中

mysql - 'i.email' 中的未知列 'where clause'