2016-04-13 22 views
0

タイトル、ページ、価格、ロイヤリティなど、すべての書籍に関する情報が含まれているテーブルがあります。 私はこれらのテーブルを使用して5人の著者を検索したいと思います最も高いロイヤルティ率を有する。ここでSQL - テーブル内の5つの数字を見つける

は私のテーブルです:これまでのところ

CREATE TABLE authors 
    (
    au_id CHAR(3)  NOT NULL, 
    au_fname VARCHAR(15) NOT NULL, 
    au_lname VARCHAR(15) NOT NULL, 
    phone VARCHAR(12)   , 
    address VARCHAR(20)   , 
    city  VARCHAR(15)   , 
    state CHAR(2)    , 
    zip  CHAR(5)    , 
    CONSTRAINT pk_authors PRIMARY KEY (au_id) 
)ENGINE = InnoDB; 


CREATE TABLE royalties 
    (
    title_id  CHAR(3)  NOT NULL, 
    advance  DECIMAL(9,2)   , 
    royalty_rate DECIMAL(5,2)   , 
    CONSTRAINT pk_royalties PRIMARY KEY (title_id) 
)ENGINE = InnoDB; 

、私は最高の料率を選択することができます。 TOP(5)関数を使ってみましたが、うまくいきませんでした。私のコードは以下の通りです。

SELECT au_fname, au_lname 
FROM authors 
WHERE au_id IN 
(SELECT au_id 
FROM title_authors 
WHERE title_id IN 
(SELECT title_id 
FROM royalties 
WHERE royalty_rate = (SELECT MAX(royalty_rate) FROM royalties))) 

ロイヤルティ率が最も高い5人の著者を探すにはどうすればよいですか?

+1

構文はMySQLであるため、MySQLのタグを追加しました。 –

答えて

2

MySQLはTOPキーワードをサポートしていません。 MySQL以外のいくつかのデータベース(例えば、SQL Server、Teradata、など)は、その構文をサポートしています。

MySQLは、LIMITキーワードと同様の機能を提供します。ことを、著者は最高royalty_rate 2つ(またはそれ以上)のタイトルを持っている場合は、その

SELECT a.au_fname 
     , a.au_lname 
    FROM authors a 
    JOIN title_authors t 
     ON t.au_id = a.au_id 
    JOIN royalties r 
     ON r.title_id = t.title_id 
    ORDER BY r.royalty_rate DESC 
    LIMIT 5 

注:限り、結果を得るように、私は強くあなたが結合操作を使用してお勧めします

SELECT t.foo 
    FROM mytable t 
ORDER BY t.bar DESC 
LIMIT 5 

著者は複数回返されます。

5つの著者がの投稿者の著者と異なるようにしたい場合は、各著者の最大ロイヤルティ率を見つけ、それによって注文してください。

SELECT a.au_fname 
     , a.au_lname 
    FROM authors a 
    JOIN title_authors t 
     ON t.au_id = a.au_id 
    JOIN royalties r 
     ON r.title_id = t.title_id 
    GROUP BY a.au_id 
    ORDER BY MAX(r.royalty_rate) DESC 
    LIMIT 5 

5人以上の著者が同じロイヤルティ率を持つ場合、そのうち5人は不確定です。 ORDER BY句に式を追加して、結果をより確定的にすることができます。あなたが使用することを学ぶ必要があります

ORDER BY MAX(r.royalty_rate) DESC, a.id DESC 
0

が参加し、集約:

SELECT a.au_fname, a.au_lname 
FROM authors a JOIN 
    title_authors ta 
    USING (au_id) JOIN  
    royalties r 
    USING (title_id) 
ORDER BY royalty_rate DESC 
LIMIT 5; 

MySQLは最初の5行をフェッチするLIMITを使用しています。

関連する問題