【问题标题】:How to return specific order of results from subquery如何从子查询返回特定的结果顺序
【发布时间】:2021-04-28 14:29:49
【问题描述】:

我有下表,其中包含 postId 并映射到 rootPostId

CREATE TABLE "PostMap" (
    "postId" BIGINT,
    "rootPostId" BIGINT );


INSERT INTO "PostMap" ("postId","rootPostId") VALUES (1,1);
INSERT INTO "PostMap" ("postId","rootPostId") VALUES (2,1);
INSERT INTO "PostMap" ("postId","rootPostId") VALUES (3,3);
INSERT INTO "PostMap" ("postId","rootPostId") VALUES (4,1);

postId,rootPostId
1,1
2,1
3,3
4,1

我有以下疑问:

SELECT "postId"
FROM "PostMap" 
WHERE "rootPostId" = (
    SELECT "rootPostId"
    FROM "PostMap"
    WHERE "postId" = 2
    )

返回结果:

postId
1,
2,
4

我希望返回以下内容,以便返回的 first postId 是传递给查询 (postId = 2) 的相应 postId,如下所示。

返回期望的结果:

postId
2,
1,
4

【问题讨论】:

  • 典型的解决方案是在查询中添加一个“分数”列,以告知哪个结果更相关。然后你只需按分数列排序。

标签: mysql sql postgresql


【解决方案1】:

您可以添加:

order by (postid = 2) desc

这应该适用于 Postgres 和 MySQL。

【讨论】:

    【解决方案2】:

    我会用 case 以任何方式配置您要排序的列。

    我猜示例中的“2”应该是一个参数。不管怎样,试试这个查询:

         SELECT "postId"
            FROM "PostMap" 
            WHERE "rootPostId" = (
                SELECT "rootPostId"
                FROM "PostMap"
                WHERE "postId" = 2
                )
            order by case when "postId" = 2 then 0
                        else 1 + "postId"
                        end
        ;
    

    如您所见,我们按大小写排序查询,当 postId = 2 和 1 + PostId 在任何其他情况下都为零,因此大于零并且仍然按 postid 排序。

    使用参数 (:SelectedPost) 而不是值 2:

    SELECT "postId"
    FROM "PostMap" 
    WHERE "rootPostId" = (
        SELECT "rootPostId"
        FROM "PostMap"
        WHERE "postId" = :SelectedPost
        )
    order by case when "postId" = :SelectedPost then 0
                else 1 + "postId"
                end
    ;
    

    【讨论】:

    • 好吧,虽然我在回答,但我想之前的回答已经足够好了。很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2017-04-13
    相关资源
    最近更新 更多