我有(简化的)以下模型:
Book
  id
  name
BookCategory
  book_id
  category_id
  rank
Category
  id
  name
使用给定的类别 ID,我希望将具有该类别的书籍作为排名最高的书籍。
我将举一个例子来更清楚地说明它:
Book   
id    name   
---  -------
1     On Writing
2     Zen teachings
3     Siddharta
BookCategory   
book_id category_id      rank   
---       -------        -----
1        2               34.32
1        5               24.23
1        9               54.65
2        5               27.33
2        9               28.32
3        2               30.43
3        5               27.87
Category   
id    name   
---  -------
2     Writing
5     Spiritual
9     Buddism
category_id = 2 的结果将是 id = 3 的书。
这是我正在运行的查询:
SELECT book."name" AS bookname
FROM bookcategory AS bookcat
LEFT JOIN book ON bookcat."book_id" = book."id" 
LEFT JOIN category cat ON bookcat."category_id" = cat."id" 
WHERE cat."id" = 2
ORDER BY bookcat."rank"
这不是正确的方法,因为它没有选择每本书的最高排名。我还没有找到合适的解决方案。
注意:我使用的是 postgresql 9.1 版本。
编辑:
DB Schema(取自马丁的 SQL Fiddle 答案):
create table Book (
  id int,
  name varchar(16)
  );
insert into Book values(1, 'On Writing');
insert into Book values(2, 'Zen teachings');
insert into Book values(3, 'Siddharta');
create table BookCategory (
  book_id int,
  category_id int,
  rank real
  );
insert into BookCategory values(1,2,34.32);
insert into BookCategory values(1,5,24.23);
insert into BookCategory values(1,9,54.65);
insert into BookCategory values(2,5,27.33);
insert into BookCategory values(2,9,28.32);
insert into BookCategory values(3,2,30.43);
insert into BookCategory values(3,5,27.87);
create table Category (
  id int,
  name varchar(16)
  );
insert into Category values(2, 'Writing');
insert into Category values(5,'Spiritual');
insert into Category values(9,    'Buddism');