我使用STRING_AGG解决了POSTGRES SQL中的问题

问题描述 投票:0回答:1

运行sql查询后无法得到想要的结果。

作为一名学生,我正在研究 SQL 问题。我必须解决一个问题,那就是

“对于出现在古典播放列表中的作曲家,请创建相应(不同)播放列表名称的逗号分隔列表。”

预期的列名称:composer、list_of_playlists

我使用STRING_AGG()来解决POSTGRES SQL中的问题。

SELECT
t.composer,
STRING_AGG(p.name, ', ' ORDER BY p.playlist_id) AS list_of_playlists
FROM playlist_track AS pt
JOIN track AS t
ON pt.track_id = t.track_id
JOIN playlist AS p
ON pt.playlist_id = p.playlist_id
WHERE p.name LIKE '%Classical%' AND t.composer IS NOT NULL
GROUP BY t.composer

运行SQL查询后的结果如下:

| composer           | list_of_playlists                       |
|                    |                                         |
| Aaron Copland      | Classical, Classical 101 - The Basics   |
| Anonymous          | Classical, Classical 101 - The Basics   |
| Antonio Vivaldi    | Classical, Classical 101 - The Basic    |
| Astor Piazzola     | Classical, Classical 101 - Deep Cuts    |
| Bela Bartok        | Classical, Classical 101 - Deep Cuts    |

下面是由 Composer、PLAYLIST_ID 和 NAME 组成的表格的小示例

COMPOSER       Playlist_id      Name

Aaron Copland     12           Classical
Aaron Copland     15           Classical 101 - The Basics
Anonymous     12           Classical
Anonymous     15           Classical 101 - The Basics
Antonio Vivaldi   15           Classical 101 - The Basics
Antonio Vivaldi   12           Classical
Astor Piazzolla   13           Classical 101 - Deep Cuts
Astor Piazzolla   12           Classical
Béla Bartók   13           Classical 101 - Deep Cuts
Béla Bartók   12           Classical

我应该在 SQL 查询中进行哪些更改才能得到如下结果:

| composer           | list_of_playlists                       |
|                    |                                         |
| Aaron Copland      | Classical, Classical 101 - The Basics   |
| Anonymous          | Classical, Classical 101 - The Basics   |
| Antonio Vivaldi    | Classical 101 - The Basic, Classical    |
| Astor Piazzola     | Classical 101 - Deep Cuts, Classical    |
| Bela Bartok        | Classical 101 - Deep Cuts, Classical    |
postgresql
1个回答
0
投票

对于所提供的数据,无法对查询进行任何实际更改来保证所需的列表顺序,因为没有合适的属性可供排序。按照评论之一的建议,从

ORDER BY
中删除
STRING_AGG
将产生一个列表,其顺序由表存储中行的排列决定,这不是可以直接控制的(也不是
playlist_id 
name
都不会产生所需的顺序)。为了演示不使用
ORDER BY
时对检索顺序的依赖性,请创建一个表并插入两个值:

CREATE TABLE order_test (
  id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  description TEXT
);

INSERT INTO
  order_test (description)
VALUES
  ('first item'),
  ('second item');

跑步

SELECT
  STRING_AGG(description, ', ')
FROM
  order_test;

退货 |列表| |-| |第一项,第二项|

本次更新后

UPDATE order_test
SET
  description = description
WHERE
  description = 'first item';

运行

SELECT
查询返回 |列表| |-| |第二项,第一项|

© www.soinside.com 2019 - 2024. All rights reserved.