私は(簡略化された)次のモデルを持っています:
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"
これは、各本の最大ランクを選択しないため、これを行う正しい方法ではありません。私はまだ適切な解決策を見つけていません。
注:私はpostgresql9.1バージョンを使用しています。
編集:
DBスキーマ(martinの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');