如何使用数据引用的 *_id 字段 separate/format string_agg() 聚合数据?
How do I separate/format string_agg() aggregated data using the *_id fields the data refers to?
这个问题是我之前可以找到的问题的延续 。
This SQLFiddle 正在使用我在下面描述的数据库结构和查询。
数据库看起来像:
CREATE TABLE artistnames (
artistname_id SERIAL PRIMARY KEY,
artistname TEXT UNIQUE NOT NULL
);
CREATE TABLE artistalias (
artistalias_id SERIAL PRIMARY KEY,
artistname_id SERIAL REFERENCES artistnames (artistname_id),
artistalias TEXT UNIQUE NOT NULL
);
CREATE TABLE songs (
song_id SERIAL PRIMARY KEY,
song TEXT NOT NULL,
artistalias_id SERIAL REFERENCES artistalias (artistalias_id)
);
- 一位艺术家(table 个艺术家姓名)可以有零个、一个或多个别名
- 一个别名(table artistalias)恰好属于一位艺术家
- 一首歌曲(table 首歌曲)有一位或多位艺术家(指的是他用来表演这首歌的艺术家的别名)
示例:
艺术家 Francis Veigar 还使用别名 Francis Fat 和 Francis Fighter。一首歌曲 Song 1 已发行,艺术家姓名为 Francis Veigar,另一首歌曲 Song 2 他使用笔名 Francis Fat 和第三首歌 Song 3 他使用别名 Francis Fighter 演唱,与另一位艺术家 Peeka Boo.
使用查询
SELECT
string_agg(distinct(artistname), ' & ') AS artist_primary_name,
string_agg(distinct(a1.artistalias), ' & ') AS performed_song_with_alias,
string_agg(a2.artistalias, ' & ') AS other_pseudonymes,
song
FROM
artistalias a1
left JOIN artistalias a2 ON a2.artistname_id = a1.artistname_id
left JOIN songs s ON s.artistalias_id = a1.artistalias_id
left JOIN artistnames ON artistnames.artistname_id = a1.artistname_id
GROUP BY song;
显示 other_pseudonymes
列,如
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| artist_primary_name | performed_song_with_alias | other_pseudonymes | song |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar | Francis Veigar | Francis Veigar & Francis Fat & Francis Fighter | Song 1 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar | Francis Fat | Francis Veigar & Francis Fat & Francis Fighter | Song 2 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar & Peeka Boo | Francis Fighter & Peeka Boo | Francis Veigar & Francis Fat & Francis Fighter & Peeka Boo & Peeka | Song 3 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Peeka Boo | Peeka | Peeka Boo & Peeka | Song 4 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
我希望它看起来像
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| artist_primary_name | performed_song_with_alias | other_pseudonymes | song |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar | Francis Veigar | Francis Veigar & Francis Fat & Francis Fighter | Song 1 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar | Francis Fat | Francis Veigar & Francis Fat & Francis Fighter | Song 2 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar & Peeka Boo | Francis Fighter & Peeka Boo | Francis Veigar & Francis Fat & Francis Fighter / Peeka Boo & Peeka | Song 3 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Peeka Boo | Peeka | Peeka Boo | Song 4 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
使用“/”分隔 pseudonymes/aliases 两位不同的艺术家。必须在查询中更改什么才能实现?
使用子查询,然后 SELECT
聚合元素并再次使用 string_agg
:
SELECT
string_agg(distinct(artistname), ' & ') AS artist_primary_name,
string_agg(distinct(a1.artistalias), ' & ') AS performed_song_with_alias,
string_agg(distinct(col),' / ') AS other_pseudonymes,
song
FROM
artistalias a1
left JOIN artistalias a2 ON a2.artistname_id = a1.artistname_id
left JOIN songs s ON s.artistalias_id = a1.artistalias_id
left JOIN artistnames ON artistnames.artistname_id = a1.artistname_id
left join
(SELECT
string_agg(a2.artistalias, ' & ') as col,
artistname_id
FROM artistalias a2
GROUP BY artistname_id)
AS aggregated_aliases ON aggregated_aliases.artistname_id = artistnames.artistname_id
GROUP BY song;
这个问题是我之前可以找到的问题的延续
This SQLFiddle 正在使用我在下面描述的数据库结构和查询。
数据库看起来像:
CREATE TABLE artistnames (
artistname_id SERIAL PRIMARY KEY,
artistname TEXT UNIQUE NOT NULL
);
CREATE TABLE artistalias (
artistalias_id SERIAL PRIMARY KEY,
artistname_id SERIAL REFERENCES artistnames (artistname_id),
artistalias TEXT UNIQUE NOT NULL
);
CREATE TABLE songs (
song_id SERIAL PRIMARY KEY,
song TEXT NOT NULL,
artistalias_id SERIAL REFERENCES artistalias (artistalias_id)
);
- 一位艺术家(table 个艺术家姓名)可以有零个、一个或多个别名
- 一个别名(table artistalias)恰好属于一位艺术家
- 一首歌曲(table 首歌曲)有一位或多位艺术家(指的是他用来表演这首歌的艺术家的别名)
示例: 艺术家 Francis Veigar 还使用别名 Francis Fat 和 Francis Fighter。一首歌曲 Song 1 已发行,艺术家姓名为 Francis Veigar,另一首歌曲 Song 2 他使用笔名 Francis Fat 和第三首歌 Song 3 他使用别名 Francis Fighter 演唱,与另一位艺术家 Peeka Boo.
使用查询
SELECT
string_agg(distinct(artistname), ' & ') AS artist_primary_name,
string_agg(distinct(a1.artistalias), ' & ') AS performed_song_with_alias,
string_agg(a2.artistalias, ' & ') AS other_pseudonymes,
song
FROM
artistalias a1
left JOIN artistalias a2 ON a2.artistname_id = a1.artistname_id
left JOIN songs s ON s.artistalias_id = a1.artistalias_id
left JOIN artistnames ON artistnames.artistname_id = a1.artistname_id
GROUP BY song;
显示 other_pseudonymes
列,如
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| artist_primary_name | performed_song_with_alias | other_pseudonymes | song |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar | Francis Veigar | Francis Veigar & Francis Fat & Francis Fighter | Song 1 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar | Francis Fat | Francis Veigar & Francis Fat & Francis Fighter | Song 2 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar & Peeka Boo | Francis Fighter & Peeka Boo | Francis Veigar & Francis Fat & Francis Fighter & Peeka Boo & Peeka | Song 3 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Peeka Boo | Peeka | Peeka Boo & Peeka | Song 4 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
我希望它看起来像
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| artist_primary_name | performed_song_with_alias | other_pseudonymes | song |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar | Francis Veigar | Francis Veigar & Francis Fat & Francis Fighter | Song 1 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar | Francis Fat | Francis Veigar & Francis Fat & Francis Fighter | Song 2 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar & Peeka Boo | Francis Fighter & Peeka Boo | Francis Veigar & Francis Fat & Francis Fighter / Peeka Boo & Peeka | Song 3 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Peeka Boo | Peeka | Peeka Boo | Song 4 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
使用“/”分隔 pseudonymes/aliases 两位不同的艺术家。必须在查询中更改什么才能实现?
使用子查询,然后 SELECT
聚合元素并再次使用 string_agg
:
SELECT
string_agg(distinct(artistname), ' & ') AS artist_primary_name,
string_agg(distinct(a1.artistalias), ' & ') AS performed_song_with_alias,
string_agg(distinct(col),' / ') AS other_pseudonymes,
song
FROM
artistalias a1
left JOIN artistalias a2 ON a2.artistname_id = a1.artistname_id
left JOIN songs s ON s.artistalias_id = a1.artistalias_id
left JOIN artistnames ON artistnames.artistname_id = a1.artistname_id
left join
(SELECT
string_agg(a2.artistalias, ' & ') as col,
artistname_id
FROM artistalias a2
GROUP BY artistname_id)
AS aggregated_aliases ON aggregated_aliases.artistname_id = artistnames.artistname_id
GROUP BY song;