【问题标题】:Writing Database Function in PostgreSql - Supabase在 PostgreSql 中编写数据库函数 - Supabase
【发布时间】:2022-10-19 14:33:25
【问题描述】:

我需要有关从 PostgreSQL 数据库查询数据的帮助。目前在客户端,这是发送到服务器的查询:

await Supabase.instance.client
        .from('books')
        .select('''*,BookBy:authors(*), likes(likedBy), totalLikes:likes(count)''')
        .match({'likes.likedBy': loggedInUserUid,'category': categoryId})
        .order('id');

此查询当前以以下结构返回数据:

[{
   'id': 1,
   'title':'...',
   'Description': '...',
   'Published Date':'...',
   'categoryId':'3',
   'BookBy':{
              'id': 1,
              'Author':'...',
              'Bio':'...',
              'Picture':'...'
            },
   'likes':{'likedBy':'...'},
   'totalLikes':{'count':30},       
}]

通过使用 match 语句,它获取与提供的 categoryId 匹配的所有书籍。 另外,我这里的主表是书籍和(作者,喜欢)表是外来的,“totalLikes”用作别名来查询同一个外来“喜欢”表的计数。

我现在想弄清楚的是如何按受欢迎程度查询书籍。

因此,当检索数据时,它是按每本书的点赞数排序的。

当前获取顺序:

Ex: Book id 1, 50 likes
    Book id 2, 60 likes
    Book id 3, 20 likes
    Book id 4, 30 likes
    Book id 5, 25 likes

预期获取顺序:

EX: Book id 2, 60 likes
    Book id 1, 50 likes
    Book id 4, 30 likes
    Book id 5, 25 likes
    Book id 3, 20 likes

我不知道这是否应该在客户端查询,或者我是否应该编写一个数据库函数来处理这个问题。如果是后一种选择,那么我将不胜感激有关如何做到这一点的任何指导,因为我对 PostgreSQL 数据库还很陌生。

【问题讨论】:

    标签: database postgresql flutter supabase


    【解决方案1】:

    我认为在这种情况下您需要一个数据库函数,并从您的客户端使用.rpc() 调用该函数。

    您可能需要进行一些调整以适应您的特定用例,但希望这可以为您提供所需功能的大致方向。

    create or replace function liked_books(category_id text)
    returns setof record
    language sql
    as
    $$
      select books.id, books.title, count(likes.id) as likes_count
        from books
        left join likes on books.id = likes.book_id
        where books.category = liked_books.category_id
        group by books.id
        order by likes_count desc;
    $$;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 2017-02-15
      • 2012-12-13
      • 2021-07-11
      • 2018-08-25
      • 1970-01-01
      • 2019-06-28
      相关资源
      最近更新 更多