【问题标题】:SQL to retrieve the latest records, grouping by unique foreign keysSQL 检索最新记录,按唯一外键分组
【发布时间】: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???

【问题讨论】:

    标签: sql mysql database duplicates greatest-n-per-group


    【解决方案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,查询只找到当前用户和当前线程的最后一篇文章。你试过了吗?
      猜你喜欢
      • 2021-09-02
      • 2017-03-09
      • 1970-01-01
      • 2014-03-20
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2013-11-09
      相关资源
      最近更新 更多