Sql 找不到数据类型字符变化[]的数组类型

Sql 找不到数据类型字符变化[]的数组类型,sql,arrays,postgresql,Sql,Arrays,Postgresql,我有三个表(下面的模式)。我想选择所有用户并在2d数组中显示他们的不同标记/不同标记的计数,如 1 | ['javascript':3] 2 | ['javascript':3, 'windows':2, 'osx':17] ... 在回顾了有关stackoverflow的其他问题后,我有: select "Users".id, array_agg(array[q."TagName"::varchar[], q."TagCount"]

我有三个表(下面的模式)。我想选择所有用户并在2d数组中显示他们的不同标记/不同标记的计数,如

1 | ['javascript':3]
2 | ['javascript':3, 'windows':2, 'osx':17]
...
在回顾了有关stackoverflow的其他问题后,我有:

select "Users".id, array_agg(array[q."TagName"::varchar[], q."TagCount"]::varchar[])
FROM "Users" 
LEFT JOIN (select "UserTags"."UserId" as "UserId", "Tags".name as "TagName", count("Tags".name)::varchar as "TagCount"
from "UserTags" 
LEFT JOIN "Tags" ON ("UserTags"."TagId" = "Tags".id)
GROUP BY "UserTags"."UserId", "Tags".id
 ) as q ON ("Users".id = "q"."UserId")
 group by "Users".id
并获取一个错误:
找不到数据类型字符变化[]的数组类型。

如何修改上述查询以解决此问题

----模式----

标签

CREATE TABLE "Tags" (
    id integer DEFAULT nextval('"Tags_id_seq"'::regclass) PRIMARY KEY,
    name character varying(255),
    "createdAt" timestamp with time zone NOT NULL,
    "updatedAt" timestamp with time zone NOT NULL
);

-- Indices -------------------------------------------------------

CREATE UNIQUE INDEX "Tags_pkey" ON "Tags"(id int4_ops);
用户

CREATE TABLE "Users" (
    id integer DEFAULT nextval('"Users_id_seq"'::regclass) PRIMARY KEY,
    "firstName" character varying(255),
    "lastName" character varying(255),
    email character varying(255),
    manager boolean,
    "createdAt" timestamp with time zone NOT NULL,
    "updatedAt" timestamp with time zone NOT NULL,
    "AgencyId" character varying(255),
    "slackId" character varying(255),
    profile json,
    channel character varying(255),
    "scorecardCode" character varying(255),
    "imageUrl" character varying(255),
    "userName" character varying(255)
);

-- Indices -------------------------------------------------------

CREATE UNIQUE INDEX "Users_pkey" ON "Users"(id int4_ops);
UserTagsFK UserId=Users.id,TagId=Tags.id

CREATE TABLE "UserTags" (
    id integer DEFAULT nextval('"UserTags_id_seq"'::regclass) PRIMARY KEY,
    "UserId" integer NOT NULL REFERENCES "Users"(id),
    "TagId" integer NOT NULL REFERENCES "Tags"(id),
    "createdAt" timestamp with time zone,
    "updatedAt" timestamp with time zone
);

-- Indices -------------------------------------------------------

CREATE UNIQUE INDEX "UserTags_pkey" ON "UserTags"(id int4_ops);


您是否尝试重新创建没有引号的表? 我试着复制你的场景,并得到了一个很好的结果,我想

见:

我稍微更改了一下查询:

select Users.id
    , ARRAY_AGG(ARRAY[q.TagName, q.TagCount])
FROM Users 
LEFT JOIN
(
    select UserTags.UserId as UserId,  
    Tags.name as TagName, count(Tags.name)::varchar as TagCount
    from UserTags 
    LEFT JOIN Tags ON (UserTags.TagId = Tags.id)
    GROUP BY UserTags.UserId, Tags.id
) as q ON (Users.id = q.UserId)
group by Users.id;
得到了这样的结果:

1 | {{javascript,1},{osx,1}} 
2 | {{osx,1},{windows,2}}

告诉我是否适合您。

请勿发布表格图像。将
CREATE
INSERT
语句作为文本(无图像!)粘贴到您的帖子中。我已经添加了CREATE语句并删除了图像
q.“标记名”::varchar[]
应该是与您的问题无关的
q.“标记名”
,但是:您应该真正避免那些可怕的带引号的标识符。他们的麻烦远比他们值得的多。
1 | {{javascript,1},{osx,1}} 
2 | {{osx,1},{windows,2}}