PostgreSQL 重复多行
PostgreSQL duplicate multiple rows
有一个应用程序需要由用户(管理员)通过 UI (contenteditable=true) 翻译table。
为此,我创建了一个带有 table 的 postgres(PostgreSQL 版本 13.5)数据库,其中包含以下内容:
|lang|key |createdby|version|value|
|----| ---| --- | --- | --- |
|en | key.to.value |someone| 4 | some english words|
|en | key.to.value |someone| 3 | some egnlish words|
|en | key.to.value |someone| 42 | some english words|
|de | key.to.value|someone|12|some german words|
|de | key.to.value|someone|23456|some german words|
lang 键和版本为主键。
每列的类型都是文本。 table 还包含条目的所有旧版本,以便在需要时能够切换到旧版本。
现在我必须增加创建一种新语言的可能性,它具有英语行的最高版本数据,但 'new language'(西班牙语、葡萄牙语等)作为 lang,“1”作为版本。
用户将能够在 UI 中选择“添加新语言”并获取英语值以开始翻译。
编辑
我需要用最高版本复制每个英文行并将 lang 设置为 'whateEverLanguage' 并将版本设置为版本 '1'
那是我最后一次尝试:
insert into strings
(lang, key, createdby, version, value)
values
(
(select 'esp'),
(select key from strings where lang='en' and version = (select max(version) from strings where lang='en')),
(select createdby from strings where lang='en' and version = (select max(version) from strings where lang='en')),
(select version from strings where lang='en' and version = (select max(version) from strings where lang='en')),
(select value from strings where lang='en' and version = (select max(version) from strings where lang='en')));
大约 1 周前我才开始使用数据库。
我为此感到沮丧,所以请帮助我。
如果要为每个键检索 'en' 语言的最新版本,您需要过滤 lang = 'en'
所在的行,按 key
对行进行分组,对使用聚合函数按 version DESC
、select 对行进行分组 第一行,例如 array_agg()
:
SELECT key
, (array_agg(value ORDER BY version DESC))[1]
FROM strings
WHERE lang = 'en'
GROUP BY key
如果您只想要一个 specific_key
的 'en' 值,您可以另外过滤该键:
SELECT key
, (array_agg(value ORDER BY version DESC))[1]
FROM strings
WHERE key = specific_key
AND lang = 'en'
GROUP BY key
如果你想插入新行,那么你可以这样做:
insert into strings (lang, key, createdby, version, value)
select 'spanish'
, key
, (array_agg(createdby order by version desc))[1]
, '1'
, (array_agg(value order by version desc))[1]
from strings
where lang = 'en'
group by key
查看dbfiddle
中的测试结果
有一个应用程序需要由用户(管理员)通过 UI (contenteditable=true) 翻译table。 为此,我创建了一个带有 table 的 postgres(PostgreSQL 版本 13.5)数据库,其中包含以下内容:
|lang|key |createdby|version|value|
|----| ---| --- | --- | --- |
|en | key.to.value |someone| 4 | some english words|
|en | key.to.value |someone| 3 | some egnlish words|
|en | key.to.value |someone| 42 | some english words|
|de | key.to.value|someone|12|some german words|
|de | key.to.value|someone|23456|some german words|
lang 键和版本为主键。
每列的类型都是文本。 table 还包含条目的所有旧版本,以便在需要时能够切换到旧版本。
现在我必须增加创建一种新语言的可能性,它具有英语行的最高版本数据,但 'new language'(西班牙语、葡萄牙语等)作为 lang,“1”作为版本。 用户将能够在 UI 中选择“添加新语言”并获取英语值以开始翻译。
编辑 我需要用最高版本复制每个英文行并将 lang 设置为 'whateEverLanguage' 并将版本设置为版本 '1'
那是我最后一次尝试:
insert into strings
(lang, key, createdby, version, value)
values
(
(select 'esp'),
(select key from strings where lang='en' and version = (select max(version) from strings where lang='en')),
(select createdby from strings where lang='en' and version = (select max(version) from strings where lang='en')),
(select version from strings where lang='en' and version = (select max(version) from strings where lang='en')),
(select value from strings where lang='en' and version = (select max(version) from strings where lang='en')));
大约 1 周前我才开始使用数据库。 我为此感到沮丧,所以请帮助我。
如果要为每个键检索 'en' 语言的最新版本,您需要过滤 lang = 'en'
所在的行,按 key
对行进行分组,对使用聚合函数按 version DESC
、select 对行进行分组 第一行,例如 array_agg()
:
SELECT key
, (array_agg(value ORDER BY version DESC))[1]
FROM strings
WHERE lang = 'en'
GROUP BY key
如果您只想要一个 specific_key
的 'en' 值,您可以另外过滤该键:
SELECT key
, (array_agg(value ORDER BY version DESC))[1]
FROM strings
WHERE key = specific_key
AND lang = 'en'
GROUP BY key
如果你想插入新行,那么你可以这样做:
insert into strings (lang, key, createdby, version, value)
select 'spanish'
, key
, (array_agg(createdby order by version desc))[1]
, '1'
, (array_agg(value order by version desc))[1]
from strings
where lang = 'en'
group by key
查看dbfiddle
中的测试结果