Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按多个关系的第一条记录对表进行排序_Sql_Ruby On Rails_Postgresql - Fatal编程技术网

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
将每本书取一次