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 检索最新记录,按唯一外键分组的主要内容,如果未能解决你的问题,请参考以下文章

SQL:查找按用户分组的最新两个记录之间的差异

Linq to sql 按多条记录分组

需要在 Mongoose 中获取按外键分组的记录列表

无法检索记录使用jpa库外键时为空

MySQL SQL 获取表中的最新记录?

SQL如何从每个连接表中检索最新结果