【问题标题】:PostgreSQL: how do you SELECT DISTINCT relations and order by different fields depending on WHERE clause?PostgreSQL:如何根据 WHERE 子句按不同字段选择 DISTINCT 关系和排序?
【发布时间】:2011-10-01 13:51:21
【问题描述】:

每个帐户都与一个人和一种帐户相关联。我想选择一个不同的帐户子集。为了被选中,帐户至少满足两个标准之一。如果一个帐户出现两次

我想根据两个不同的字段对该结果集进行排序。这是我的尝试:

Select DISTINCT a.*
FROM people AS p
JOIN accounts AS a
ON a.people_id = p.id
JOIN type_account AS t
ON t.type_id = a.id
WHERE t.id IN(1,3,5)
OR p.id IN(2,4,6)
ORDER BY(CASE
         WHEN p.id IN(2,4,6) THEN p.updated_at
         WHEN t.id IN(1,3,5) THEN p.created_at) AS position

我收到了这个错误:SELECT DISTINCT, ORDER BY expressions must appear in select list

如果我将 case 语句移到 select 中,则一个帐户(与不同的人相关联)可能会出现在结果中两次,即在满足第一个 where 子句时出现一次,在满足第二个 where 子句时出现两次。在这种情况下,帐户将在结果集中出现两次。

我很难理解这个问题。任何帮助将不胜感激:)

【问题讨论】:

    标签: sql postgresql join distinct case


    【解决方案1】:

    将您的 CASE 语句移动到 SELECT 子句中,然后按它们的位置排序:

    SELECT
        CASE
            WHEN p.id IN(2,4,6) THEN p.updated_at
            WHEN t.id IN(1,3,5) THEN p.created_at
        END AS position,
        DISTINCT a.*
    FROM people AS p
    JOIN accounts AS a
    ON a.people_id = p.id
    JOIN type_account AS t
    ON t.type_id = a.id
    WHERE t.id IN(1,3,5)
    OR p.id IN(2,4,6)
    ORDER BY 1 DESC
    LIMIT 1;
    

    【讨论】:

    • 但是一个帐户(与不同的人相关联)可能会出现在结果中两次,即在满足第一个 where 子句时出现一次,在满足第二个 where 子句时出现两次。在这种情况下,帐户将在结果集中出现两次。
    • 所以也许你想要一个子查询?我很难完全理解您的要求。
    • 我的要求是结果集中只需要一个账号。
    • 添加LIMIT 1 可以轻松实现。不过,我不知道这是否会返回 正确 帐户。
    • 至少就我当前的任务而言,正确的帐户是具有较高位置值的帐户(案例陈述)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多