Sql 按多个关系的第一条记录对表进行排序
我有: 所以我可以列出有多个作者的书 我想按第一作者的名字对书进行分类Sql 按多个关系的第一条记录对表进行排序,sql,ruby-on-rails,postgresql,Sql,Ruby On Rails,Postgresql,我有: 所以我可以列出有多个作者的书 我想按第一作者的名字对书进行分类 有什么办法吗?您可以接受您的查询并添加: Book has_many :book_authors has_many :authors, through: :book_authors BookAuthor belongs_to :author belongs_to :book Author has_many :book_authors 这将按列表中第一作者的名字排序。您将接受您的查询并添加: B
有什么办法吗?您可以接受您的查询并添加:
Book
has_many :book_authors
has_many :authors, through: :book_authors
BookAuthor
belongs_to :author
belongs_to :book
Author
has_many :book_authors
这将按列表中第一作者的名字排序。您将接受您的查询并添加:
Book
has_many :book_authors
has_many :authors, through: :book_authors
BookAuthor
belongs_to :author
belongs_to :book
Author
has_many :book_authors
这将按列表中第一作者的名字排序。只有在所有书籍都有作者的情况下,这才有效。否则,没有作者的书就不会出现
order by authors
只有当所有的书都有作者时,这才有效。否则,没有作者的书就不会出现
order by authors
您可以在Author
name
列上使用聚合函数:
Book.joins(:authors).order('authors.name desc')
@Pragash
的解决方案是Book.joins(:authors.order('authors.name desc')
如果有许多作者,则会多次返回相同的书籍。但是,使用.distinct
将返回唯一的书籍
Book.left_outer_joins(:authors).group("books.id").order("MIN(authors.name)")
您可以在Author
name
列上使用聚合函数:
Book.joins(:authors).order('authors.name desc')
@Pragash
的解决方案是Book.joins(:authors.order('authors.name desc')
如果有许多作者,则会多次返回相同的书籍。但是,使用.distinct
将返回唯一的书籍
Book.left_outer_joins(:authors).group("books.id").order("MIN(authors.name)")
编辑您的问题并显示您正在使用的查询。如果可能,请重新考虑数据库设计。拥有一个有多个名字的
作者
专栏会让你的生活变得困难。一个更好的设计是为作者的名字、姓氏和赞助人(如果有的话)单独列一列,然后在作者和书籍之间建立多对多关系。您确实声明要按第一作者的名字排序。然而,按名字排序是不正常的。你会想按作者的姓氏来排序,这样就不那么直截了当了,使用您的设计。@Gordon Linoff我使用Ruby on Rails的ORM,实际上我在这里简化了问题,因为原始查询非常复杂,带有polimorphism等等。相关表的表模式是什么样子的,或者您对此没有控制权?编辑您的问题并显示您正在使用的查询。如果可能,请重新考虑数据库设计。拥有一个有多个名字的作者
专栏会让你的生活变得困难。一个更好的设计是为作者的名字、姓氏和赞助人(如果有的话)单独列一列,然后在作者和书籍之间建立多对多关系。您确实声明要按第一作者的名字排序。然而,按名字排序是不正常的。你会想按作者的姓氏来排序,这样就不那么直截了当了,使用您的设计。@Gordon Linoff我使用Ruby on Rails的ORM,实际上我在这里简化了问题,因为原始查询非常复杂,带有polimorphism等等。相关表的表模式是什么样子的,或者你对此没有控制权?但如果这本书有很多作者,它会多次返回同一本书。您还需要使用distinct
一次获取每本书,但如果同一本书有多个作者,则会多次返回。您还需要使用distinct
将每本书取一次