postgresql 用于获取用户关注的艺术家的所有歌曲的数据库查询

e5nqia27  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(152)

我相当新的Supabase和我试图找到一种方法来结构和检索所有的歌曲从艺术家的用户如下。
使用下面的代码,我可以检索用户关注的所有艺术家。我通过将userid存储在一个数组(param1 = userid)中来实现这一点

create or replace function getArtists(param1 text) returns setof artists as $$
select *
from "artists"
where param1 =ANY(artistFollowers);
$$ language sql;

然而,我无法找到一种方法来检索用户关注的所有艺术家的歌曲。

create or replace function getAllSongs(param1 text) returns setof songs as $$
select *
from "artists"
where param1 =ANY(artistFollowers)
inner join songs on artist.artistid == songs.artistid
$$ language sql;

简化表格结构。

artists TABLE
  _id SERIAL,
  artistname character(40),
  artistFollowers ARRAY[userid1, userid2, userid3]
  artistid character(40)

songs TABLE
  _id SERIAL,
  songname character(40),
  artistid character(40)
nfeuvbwi

nfeuvbwi1#

在关系数据库中,我们使用连接表来存储相关表的id,而不是使用数组来存储相关表的id。您可以在这里阅读更多信息,但您可以创建一个类似于这样的表,其中该表同时引用arts表和users表。您没有users表的定义,但我假设您在这里有一个公共users表。

create table public.artist_followers(
  artist_id int references(public.artists.id) not null,
  user_id uuid references(public.users.id)
);

每当用户关注一个新艺术家时,您就在此表中插入一个新行,其中包含artist_id和user_id。
现在,当您想要检索用户关注的艺术家创建的歌曲列表时,可以使用类似这样的数据库函数来查询它。

create or replace function getAllSongs() returns setof songs as $$
select *
from songs
where artist_id in (select id from artists inner join artist_followers on artists.id = artist_followers.artist_id where artist_followers.user_id = auth.uid());
$$ language sql;

相关问题