【问题标题】:Using values from first query to perform a second query使用第一个查询中的值执行第二个查询
【发布时间】:2020-03-09 05:00:58
【问题描述】:

我的第一个查询返回 is_root = true 的 thread_id(s)

SELECT thread_id 
FROM messages 
WHERE recipient_id = '331e1bce-2f71-4187-8ce2-edcc615de55b`
AND is_root = true

如何在每个返回的 thread_id 上使用 JOIN 来获取最新消息?

我的第二个查询得到最新消息

SELECT * FROM messages WHERE thread_id = '1b290bac-e694-40c4-86b6-c5b6e09ae8c3'
ORDER BY date_posted DESC LIMIT 1

我尝试使用子查询,但它给了我这个错误:

WITH rootcomments as(
    SELECT thread_id 
    FROM messages 
    WHERE recipient_id = '331e1bce-2f71-4187-8ce2-edcc615de55b'
    AND is_root = true
), latestmessages as(
    SELECT * FROM messages WHERE thread_id = rootcomments.thread_id
    ORDER BY date_posted DESC LIMIT 1
)SELECT * FROM latestmessages
missing FROM-clause entry for table "rootcomments"

我怎样才能使用连接来做到这一点?

编辑1: _______________________________________________________________

应该返回 message_id 3,因为它具有最高值的时间戳

但它只返回 2

尝试将 DESC 更改为 ASC,但没有成功,哈哈

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    不要使用JOIN。使用DISTINCT ON

    SELECT DISTINCT ON (thread_id) m.*
    FROM messages m 
    WHERE m.recipient_id = '331e1bce-2f71-4187-8ce2-edcc615de55b` AND
          m.is_root = true
    ORDER BY thread_id, date_posted DESC;
    

    DISTINCT ON 是一个方便的 Postgres 扩展。它为括号中的每个值组合返回一行。特定行由ORDER BY 确定。

    【讨论】:

    • 所以经过一些测试后,我不确定如何解决当前问题。现在它返回我 message_id 2 和 16(在上面的编辑中)但我需要 message_id 3 和 16,因为 3 是该线程中的最新值。我认为这个问题与 m.is_root 有关?因为在我的两个单独的查询中,我首先会得到所有带有 is_root = true 的消息,然后在我的第二个查询中我不会有 is_true 约束,我只会得到 thread_id 的 date_posted 的最大值
    • @WHOATEMYNOODLES 。 . . is_root 来自您的查询。你没有完全解释逻辑,所以这就是我所要经历的。也许你实际上并不想要它。
    猜你喜欢
    • 2014-12-02
    • 1970-01-01
    • 2013-11-01
    • 2022-11-30
    • 1970-01-01
    • 2015-07-23
    • 2016-09-19
    • 2016-08-02
    • 2019-05-05
    相关资源
    最近更新 更多