【发布时间】:2021-02-26 09:33:40
【问题描述】:
我有一个emails 表:
CREATE TABLE public.emails (
id bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
(MAXVALUE 9223372036854775807),
name text not null
);
我有一个contacts 表:
CREATE TABLE public.contacts (
id bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
(MAXVALUE 9223372036854775807),
email_id bigint NOT NULL,
full_name text NOT NULL,
ordering int not null
);
并记录如下:
insert into emails (name) VALUES ('dennis1');
insert into emails (name) VALUES ('dennis2');
insert into contacts (id, email_id, full_name, ordering) VALUES (5, 1, 'dennis1', 9);
insert into contacts (id, email_id, full_name, ordering) VALUES (6, 2, 'dennis1', 5);
insert into contacts (id, email_id, full_name, ordering) VALUES (7, 2, 'dennis5', 1);
insert into contacts (id, email_id, full_name, ordering) VALUES (8, 1, 'john', 2);
我的查询获取数据如下:
SELECT
"emails"."name",
STRING_AGG(DISTINCT CAST("contacts"."id" AS TEXT), ','
ORDER BY CAST("contacts"."id" AS TEXT)) AS "contact_ids"
FROM "emails"
INNER JOIN "contacts"
ON ("contacts"."email_id" = "emails"."id")
WHERE "emails"."id" > 0
GROUP BY "emails"."name"
ORDER BY "emails"."name" DESC LIMIT 50
实际结果
name contact_ids
dennis2 6,7
dennis1 5,8
预期结果
name contact_ids
dennis2 7,6
dennis1 8,5
我想根据ordering 列作为DESC 订购contact_ids,但我不想获取ordering 列。只需使用它来订购联系人的 id。
如何根据ordering 列对contact_ids 的每个id 进行排序?
演示:https://dbfiddle.uk/?rdbms=postgres_12&fiddle=4d6851ec67b579608427bb399eae5891
【问题讨论】:
-
如果有订购栏,为什么要省略?
-
不相关,但是:
ORDER BY CAST("contacts"."id" AS TEXT)是个坏主意,因为这会将10排在2之前
标签: sql postgresql