如何通过多个连接按日期时间获取最后一行的非分组数据?
How to get non grouped data of last row by datetime with multiple joins?
有门票,它们总是包含一些评论(至少一个)和 table 来连接它们。所有 PK 都是数字但随机的,因此,时间线基于 ticket/comment table.
的 DATETIME 字段
我需要列出所有 LAST(基于日期时间字段)评论数据(id、日期、作者、文本)和聚合字段(对票有多少评论)的门票(id、作者)。
准备好的数据库 Fiddle 在这里:https://www.db-fiddle.com/f/3PUfo2t4JkEMSA3Skw4sua/1
原始SQL查询在这里:
SELECT
tc.ticket_id AS ticket_id
, COUNT(c.id) AS comment_count
, MAX(c.created_at) AS last_at
, c.author_id AS last_author_id
, c.text AS last_text
FROM `ticket_comment` AS tc
JOIN `comment` AS c ON c.id = tc.comment_id
GROUP BY tc.ticket_id
ORDER BY last_at DESC
我遇到“ER_WRONG_FIELD_WITH_GROUP”错误,我明白为什么会这样,但不知道如何解决。
我尝试关闭ONLY_FULL_GROUP_BY
设置,但结果会导致数据错误。
预期数据:
ticket_id
comment_count
last_at
last_author_id
last_text
974442
2
2022-01-01 00:55:55
22222
t3c2
462230
2
2022-01-01 00:33:33
11111
t1c2
490694
1
2022-01-01 00:22:22
22222
t2c1
我得到的:
ticket_id
comment_count
last_at
last_author_id
last_text
974442
2
2022-01-01 00:55:55
11111
t3c1
462230
2
2022-01-01 00:33:33
11111
t1c2
490694
1
2022-01-01 00:22:22
22222
t2c1
请注意除 ticket_id
和 last_at
之外的所有字段的差异 – 都是错误的。
使用子查询检索 ticket_id 明智的评论计数,以及哪些评论最后出现基于使用 ROW_NUMBER() 的创建日期 DESC。
-- MariaDB (10.4)
SELECT p.ticket_id, p.comment_count
, p.created_at last_at
, p.author_id last_author_id
, p.text last_date
FROM (SELECT *
, COUNT(c.id) OVER(PARTITION BY ticket_id) comment_count
, ROW_NUMBER() OVER (PARTITION BY ticket_id ORDER BY c.created_at DESC) r
FROM ticket_comment t
INNER JOIN comment c
ON c.id = t.comment_id) p
WHERE p.r = 1
ORDER BY p.comment_count DESC
, p.ticket_id DESC
请检查这个urlhttps://dbfiddle.uk/?rdbms=mariadb_10.4&fiddle=b461286719332ec3592d40a246ae3bf6
有门票,它们总是包含一些评论(至少一个)和 table 来连接它们。所有 PK 都是数字但随机的,因此,时间线基于 ticket/comment table.
的 DATETIME 字段我需要列出所有 LAST(基于日期时间字段)评论数据(id、日期、作者、文本)和聚合字段(对票有多少评论)的门票(id、作者)。
准备好的数据库 Fiddle 在这里:https://www.db-fiddle.com/f/3PUfo2t4JkEMSA3Skw4sua/1
原始SQL查询在这里:
SELECT
tc.ticket_id AS ticket_id
, COUNT(c.id) AS comment_count
, MAX(c.created_at) AS last_at
, c.author_id AS last_author_id
, c.text AS last_text
FROM `ticket_comment` AS tc
JOIN `comment` AS c ON c.id = tc.comment_id
GROUP BY tc.ticket_id
ORDER BY last_at DESC
我遇到“ER_WRONG_FIELD_WITH_GROUP”错误,我明白为什么会这样,但不知道如何解决。
我尝试关闭ONLY_FULL_GROUP_BY
设置,但结果会导致数据错误。
预期数据:
ticket_id | comment_count | last_at | last_author_id | last_text |
---|---|---|---|---|
974442 | 2 | 2022-01-01 00:55:55 | 22222 | t3c2 |
462230 | 2 | 2022-01-01 00:33:33 | 11111 | t1c2 |
490694 | 1 | 2022-01-01 00:22:22 | 22222 | t2c1 |
我得到的:
ticket_id | comment_count | last_at | last_author_id | last_text |
---|---|---|---|---|
974442 | 2 | 2022-01-01 00:55:55 | 11111 | t3c1 |
462230 | 2 | 2022-01-01 00:33:33 | 11111 | t1c2 |
490694 | 1 | 2022-01-01 00:22:22 | 22222 | t2c1 |
请注意除 ticket_id
和 last_at
之外的所有字段的差异 – 都是错误的。
使用子查询检索 ticket_id 明智的评论计数,以及哪些评论最后出现基于使用 ROW_NUMBER() 的创建日期 DESC。
-- MariaDB (10.4)
SELECT p.ticket_id, p.comment_count
, p.created_at last_at
, p.author_id last_author_id
, p.text last_date
FROM (SELECT *
, COUNT(c.id) OVER(PARTITION BY ticket_id) comment_count
, ROW_NUMBER() OVER (PARTITION BY ticket_id ORDER BY c.created_at DESC) r
FROM ticket_comment t
INNER JOIN comment c
ON c.id = t.comment_id) p
WHERE p.r = 1
ORDER BY p.comment_count DESC
, p.ticket_id DESC
请检查这个urlhttps://dbfiddle.uk/?rdbms=mariadb_10.4&fiddle=b461286719332ec3592d40a246ae3bf6