SQL 检索最新记录,按唯一外键分组
Posted
技术标签:
【中文标题】SQL 检索最新记录,按唯一外键分组【英文标题】:SQL to retrieve the latest records, grouping by unique foreign keys 【发布时间】:2011-02-14 21:50:58 【问题描述】:我正在创建查询以使用 SQL DB 检索论坛中的最新帖子。
我有一个名为“Post”的表。每个帖子都有一个与“线程”和“用户”的外键关系以及创建日期。
诀窍是我不想显示同一用户的两个帖子或同一线程中的两个帖子。是否可以创建包含所有这些逻辑的查询?
# Grab the last 10 posts.
SELECT id, user_id, thread_id
FROM posts
ORDER BY created_at DESC
LIMIT 10;
# Grab the last 10 posts, max one post per user
SELECT id, user_id, thread_id
FROM post
GROUP BY user_id
ORDER BY date DESC
LIMIT 10;
# Grab the last 10 posts, max one post per user, max one post per thread???
【问题讨论】:
【参考方案1】:试试这个,看看有没有帮助:
SELECT DISTINCT
id, user_id, thread_id
FROM posts
ORDER BY created_at DESC LIMIT 10;
SELECT DISTINCT
id, user_id, thread_id
FROM post
GROUP BY user_id
ORDER BY date DESC
LIMIT 10;
您还可以看到关于此的tutorial 和关于此的discussion。 干杯! :)
【讨论】:
也许我遗漏了一些东西,但为什么 DISTINCT 会有所帮助? id列不是pk吗? DISTINCT 无济于事 - 因为 ID 总是不同的! 我知道 DISTINCT 是解决方案的一部分,但不确定它的确切用途,因此还提供了一个教程链接。【参考方案2】:我还没有测试过,但试试这个:
(
SELECT p1.id, p1.user_id, p1.thread_id
FROM post AS p1 LEFT OUTER JOIN post AS p2
ON (p1.user_id = p2.user_id AND p1.date < p2.date)
WHERE p2.id IS NULL
ORDER BY p1.date DESC
LIMIT 10
)
UNION DISTINCT
(
SELECT p3.id, p3.user_id, p3.thread_id
FROM post AS p3 LEFT OUTER JOIN post AS p4
ON (p3.thread_id = p4.thread_id AND p3.date < p4.date)
WHERE p4.id IS NULL
ORDER BY p3.date DESC
LIMIT 10
)
ORDER BY date DESC
LIMIT 10;
【讨论】:
【参考方案3】:这个呢?每个用户的第一个查询,每个用户和每个线程的第二个查询。
SELECT id, user_id, thread_id
FROM post p1
WHERE id = (SELECT id
FROM post
WHERE user_id = p1.user_id
ORDER BY date DESC
LIMIT 1)
ORDER BY date DESC
LIMIT 10;
SELECT id, user_id, thread_id
FROM post p1
WHERE id = (SELECT id
FROM post
WHERE user_id = p1.user_id
ORDER BY date DESC
LIMIT 1)
AND id = (SELECT id
FROM post
WHERE thread_id = p1.thread_id
ORDER BY date DESC
LIMIT 1)
ORDER BY date DESC
LIMIT 10;
【讨论】:
如果您在第一次查询中只获得 10 条记录,那么您可能会在第二次查询中获得少于 10 条记录,对吧? @jbox,是的,当然,在某些情况下,两个查询最终都可能少于 10 行。在第一个查询中,如果没有 10 个用户,有可能已经发布了 smth。在第二种情况下,如果 10 个不同的用户没有 10 个线程。 @jbox,查询只找到当前用户和当前线程的最后一篇文章。你试过了吗?以上是关于SQL 检索最新记录,按唯一外键分组的主要内容,如果未能解决你的问题,请参考以下文章