I have 2 tables:

CREATE TABLE `posts` (
  `帖子主题:回复:` int NOT NULL AUTO_INCREMENT,
  `author_id` int DEFAULT NULL,
  `text` text NOT NULL,
  `created` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`帖子主题:回复:`),
  KEY `fk_owner_user` (`author_id`),
  KEY `idx_帖子主题:回复:` (`帖子主题:回复:`),
  CONSTRAINT `fk_author_user` FOREIGN KEY (`author_id`) REFERENCES `users` (`user_id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

and

CREATE TABLE `Likes` (
    `like_id` int NOT NULL AUTO_INCREMENT,
    `user_id` INT DEFAULT NULL,
    `object_id` INT NOT NULL,
    `object_type_id` INT DEFAULT NULL, -- Посилання на тип об'єкта з таблиці "ObjectTypes".
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`like_id`),
    KEY `fk_like_type` (`object_type_id`),
    KEY `fk_like_user` (`user_id`),
    KEY `idx_like_id` (`like_id`),
    CONSTRAINT `fk_like_type` FOREIGN KEY (`object_type_id`) REFERENCES `ObjectTypes` (`type_id`) ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT `fk_like_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE SET NULL ON UPDATE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

I'am trying to get:

  • 帖子主题:回复:
  • 帖子正文
  • 本帖第一个点赞的ID
  • 这篇帖子上的第一个赞的日期时间
  • 本帖最后一次点赞的ID
  • 这篇帖子上最后一次喜欢的日期时间

My sql:

SELECT
  p.帖子主题:回复:,
  p.text,
  FIRST_VALUE(l.like_id) OVER (PARTITION BY p.帖子主题:回复: ORDER BY l.created_at) AS first_like_id,
  FIRST_VALUE(l.created_at) OVER (PARTITION BY l.object_id ORDER BY created_at) AS first_like_time,
  LAST_VALUE(l.like_id) OVER (PARTITION BY p.帖子主题:回复: ORDER BY l.created_at) AS last_like_id,
  LAST_VALUE(l.created_at) OVER (PARTITION BY l.object_id ORDER BY created_at) AS last_like_time
FROM
  posts p
JOIN
  Likes l
ON
  p.帖子主题:回复: = l.object_id
ORDER BY  p.帖子主题:回复: DESC;

我得到的结果如下:

120 Impedit magni vero error ut.    72  2023-10-19 04:00:00 72  2023-10-19 04:00:00
119 At eum aut quibusdam ut.    1   2023-10-02 10:54:29 1   2023-10-02 10:54:29
119 At eum aut quibusdam ut.    1   2023-10-02 10:54:29 71  2023-10-19 03:15:00
119 At eum aut quibusdam ut.    1   2023-10-02 10:54:29 94  2023-10-04 11:54:29
119 At eum aut quibusdam ut.    1   2023-10-02 10:54:29 93  2023-10-03 12:00:29
118 Sequi dolor aut quis harum. 44  2023-10-03 10:49:20 70  2023-10-19 02:45:00
118 Sequi dolor aut quis harum. 44  2023-10-03 10:49:20 44  2023-10-03 10:49:20
117 Eos totam cum blanditiis.   27  2023-10-08 22:14:05 69  2023-10-19 01:30:00
117 Eos totam cum blanditiis.   27  2023-10-08 22:14:05 27  2023-10-08 22:14:05
116 Id quaerat quisquam quia.   15  2023-10-06 07:58:51 68  2023-10-19 00:00:00
116 Id quaerat quisquam quia.   15  2023-10-06 07:58:51 15  2023-10-06 07:58:51

例如,帖子主题:回复:=119的POST有4行. 如何获取唯一行的帖子主题:回复:?

推荐答案

FIRST_VALUELAST_VALUE的默认窗口为ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

您必须明确描述窗口范围ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING:

  SELECT
    distinct
    p.post_id,
    p.text,
    FIRST_VALUE(l.like_id) OVER (PARTITION BY p.post_id ORDER BY l.created_at ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_like_id,
    FIRST_VALUE(l.created_at) OVER (PARTITION BY l.object_id ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_like_time,
    LAST_VALUE(l.like_id) OVER (PARTITION BY p.post_id ORDER BY l.created_at ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_like_id,
    LAST_VALUE(l.created_at) OVER (PARTITION BY l.object_id ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_like_time
  FROM
    posts p
  JOIN
    Likes l
  ON
    p.post_id = l.object_id
ORDER BY  p.post_id DESC

更具可读性/优化的版本:

  SELECT
    distinct
    p.post_id,
    p.text,
    FIRST_VALUE(l.like_id) OVER w AS first_like_id,
    FIRST_VALUE(l.created_at) OVER w AS first_like_time,
    LAST_VALUE(l.like_id) OVER w AS last_like_id,
    LAST_VALUE(l.created_at) OVER w AS last_like_time
  FROM
    posts p
  JOIN
    Likes l
  ON
    p.post_id = l.object_id
  WINDOW w AS (PARTITION BY p.post_id ORDER BY l.created_at ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
ORDER BY  p.post_id DESC

Mysql相关问答推荐

在MySQL中查找具有公共值的列名

用于将重复行的唯一列值作为单独列获取的SQL查询

在停靠容器中备份和恢复MySQL数据库时出现Unicode字符问题

对匹配两个或多个表的表结果进行排序

MySQL如何在触发器内部 Select 多行然后插入它们

如何更新一个巨大的表的 50k 行?

Mysql 查询返回未定义的 node.js

根据 JOIN 结果计算列中的值?

如何根据 R 中的价格范围将数据从一列复制到新列?

如何在不使用子查询的情况下按最小日期计算新用户?

在 SQL 中 for each 组返回具有最大值的行,包括具有相同值的行

mysql 执行注释部分

如何在考虑另一表的值的情况下计算一列的值

MySQLi count(*) 总是返回 1

获取Count(*)占GROUP BY中所有项目数的百分比

你如何 OR 两个 LIKE 语句?

mysqli_fetch_array() 期望参数 1 为 mysqli_result,布尔值

将 mySQL 查询作为 cron 作业(job)运行?

在mysql中复制没有数据的数据库 struct (带有空表)

加快 mysql 转储和导入