【问题标题】:SQLite Join - query most recent posts by each userSQLite Join - 查询每个用户最近的帖子
【发布时间】:2017-08-28 13:32:20
【问题描述】:

在 sqlite 数据库中,我有一个“用户”表,如下所示

用户:

| user_id  | user                       
| 1        | John               
| 2        | Peter    

如下所示的“帖子”表:

| post_id | user_id     | text
| 10      | 1           | blah blah blah
| 11      | 1           | blah blah blah
| 12      | 2           | blah blah blah

我正在使用此代码连接两个表:

SELECT * FROM Users JOIN Posts USING ( user_id )

现在我有一个不同用户的所有帖子列表如下:

| user_id  | user         | post_id   | text           
| 1        | John         | 10        | blah blah blah
| 1        | John         | 11        | blah blah blah
| 2        | Peter        | 12        | blah blah blah

假设 post_id 较大的帖子是最近发布的。
现在我想要每个用户的最新帖子列表(在本例中为第 2 行和第 3 行)。
我该怎么做?
我正在考虑删除所有行(对于每个用户),除了具有最大 post_id 的行(最近),这是一个好的解决方案吗?应该怎么查询呢?

【问题讨论】:

标签: sqlite android-sqlite


【解决方案1】:

您可以使用内部查询为您获取每个用户的最新帖子,然后该表将在与其他两个连接时充当过滤器。

select  *
from    users u
join    (
            select  user_id, max(post_id) post_id
            from    Posts
            group by user_id
        ) r
on      u.user_id = r.user_id
join    posts p
on      r.post_id = p.post_id and
        r.user_id = p.user_id

【讨论】:

  • 这给了我 3 个重复的列!但是谢谢,我稍微改了一下,效果很好。我删除了最后 3 行并将“on u.user_id ...”更改为“使用 (id)”
【解决方案2】:

在 SQLite 中(但不在任何其他 DB 中),当使用 GROUP BY 时,您可以使用 max() 或 min() 来选择要返回组中的哪一行:

SELECT user_id,
       user,
       max(post_id) AS post_id,
       text
FROM Users
JOIN Posts USING ( user_id )
GROUP BY user_id;

【讨论】:

    【解决方案3】:

    您必须稍微更改查询。您必须按如下方式编写查询:

    SELECT * FROM Users Join Posts Using(user_id) order by post_id desc;
    

    【讨论】:

    • 但是我想删除重复的行,这只会改变行的顺序
    • 更改查询:Select distinct U.user_id,U.user,P.post-id,P.text from Users U,Posts P where U.user_id=P.user_id order by post_id desc;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2016-04-24
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多