我有一个博客帖子列表,人们可以留下 comments ,我会回复他们

这是这个 struct 看起来的样子

table structure

有没有办法,只需一个查询,就能获得我不是最后一个发表 comments 的所有帖子?

理想情况下我会想要这样的东西

SELECT *
FROM posts
INNER JOIN comments
WHERE # I'm not the last person to leave a comment

这里有一个网上的例子:https://onecompiler.com/mysql/3zsb5urne 我正在使用MySQL8,但我不知道这是否重要.

这些是我try 过的一些事情(在许多其他的事情中...)

SELECT *
FROM comments
ORDER BY created_at desc
WHERE post_id = 1
LIMIT 1

我也试过这个

SELECT user_id, max(created_at)
FROM comments
GROUP BY post_id

但它不起作用,因为this is incompatible with sql_mode=only_full_group_by

(不确定这是否是第一个有效的查询)

然而,我不确定如何将其与posts表相结合/联接,从而限制每个帖子的结果.

推荐答案

您可以按如下方式使用ROW_NUMBER()窗口函数:

SELECT *
FROM posts p
JOIN (
    SELECT post_id, user_id,
        ROW_NUMBER() OVER (PARTITION BY post_id ORDER BY created_at DESC) rn
    FROM comments
) c ON p.id = c.post_id AND c.rn = 1 AND c.user_id <> 1;

或者,您可以使用如下所示的一些子查询:

SELECT *
FROM posts
WHERE id IN (
    SELECT post_id
    FROM comments
    WHERE (post_id, created_at) IN (
        SELECT post_id, MAX(created_at)
        FROM comments
        GROUP BY post_id
    )
    AND user_id <> 1
);

这是一张db<>fiddle美元.

Note:这两个帖子都没有任何 comments .

Mysql相关问答推荐

SQL不断返回查询失败,并且不知道从这里到哪里go

MySQL逻辑全部

在MySQL CLI中,是否有自动完成过程的方法?

可以优化这个带有重复WHERE子句的查询吗?

MySQL grant语句中的用户名区分大小写

时间戳上滚动窗口的 SQL 计数不同

如何根据购买的商品数量查找 unique_ids 的数量

如何本地化 MySQL 表中的实体?

MySQL Procedure 变量在 count(*) 上接收 null

将 wordpress 自定义字段转换为单个数组

从 SQL 中的左连接和内连接中减go 计数

加快 MySQL 中的行计数

Python MYSQL 更新语句

MySql 以秒为单位的两个时间戳之间的差异?

MySQL:ALTER IGNORE TABLE 给出违反完整性约束

phpMyAdmin - 无法连接 - 无效设置 - 自从我添加了 root 密码 - 被锁定

在 Mac 上设置 Laravel php artisan migrate 错误:没有这样的文件或目录

比较 MySQL 中的日期忽略 DateTime 字段的时间部分

什么是mysql的BETWEEN性能超过..?

邮箱地址可接受的字段类型和大小?