2016-12-19 13 views
3

私は、著者が書いた最大数量と、各著者が書いた数量の差を求めたいと思います。MAXとCountの間の差し引き

SELECT count(book_name) contar, (MAX(C.qty) - count(book_name)) final 
FROM (select B.author_id, count(book_name) qty 
    FROM author A ,BOOK B 
    WHERE A.author_id = B.author_id 
    GROUP BY b.author_id) C , 
author A, 
BOOK B 
WHERE A.author_id = B.author_id 
    AND B.author_id=C.Author_id 
    AND date_release BETWEEN NOW() - INTERVAL 20 YEAR AND NOW() 
GROUP BY c.author_id 
HAVING contar > 0 

あなたがbook_idauthor_idbook_namedate_release、およびテーブルAUTHORauthor_idauthor_nameauthor_lastnamedate_birthを持っている二つのテーブルBOOKがあります見ての通り。

私はこれが

results

をもたらしそうだ。しかし、私は

--------+-------+--+ 
| contar | final | | 
+--------+-------+--+ 
|  1 | -4 | | 
|  2 | -3 | | 
|  5 |  0 | | 
|  1 | -4 | | 
+--------+-------+--+ 
+0

メインクエリで過去20年間の書籍数のみがカウントされますが、サブクエリですべての書籍がカウントされるのは正しいですか? – Barmar

+0

明示的なJOINの使用を促進するために、Aaron Bertrandは素敵な記事[古いスタイルのJOINを使用する悪い習慣](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/)を書きました。それについての悪い習慣から蹴りを使う古いスタイルの結合.aspx)。 –

+0

Macの量がどのくらいあるのか説明できますか?総量は意味がありますが、最大値は意味しません。 –

答えて

3

問題は、クエリがGROUP BY c.author_idを持っているのでMAX(C.qty)は、毎作者に計算されていることです。サブクエリ全体に対してこの合計を1回だけ計算する必要があります。

著者IDがBOOKであるため、著者ごとの書籍数を取得するときにAUTHORと一緒に参加する必要はありません。

SELECT count(book_name) contar, (max_qty - count(book_name)) final 
FROM (SELECT MAX(qty) AS max_qty 
     FROM (select count(book_name) qty 
      FROM BOOK B 
      GROUP BY b.author_id) t 
    ) C 
CROSS JOIN author A 
JOIN book B ON A.author_id = B.author_id 
WHERE date_release BETWEEN NOW() - INTERVAL 20 YEAR AND NOW() 
GROUP BY A.author_id 

そして、いや冊と著者はJOINには含まれませんので、HAVING contar > 0の必要は、ありません。

+0

2番目のサブクエリにエイリアスを置く必要があります。ありがとうございました –

+0

@CamiloCipagautaこれは既に編集で追加されました。 – Barmar

2

のようなものを必要とするが、これを試してみてください。私は各数値を変数と等しくして、それらの変数を引いた。しかし変数は列として出てくるでしょう。

SELECT count(book_name) contar, 
     @max:=(MAX(C.qty)), 
     @bookcount:=(count(book_name)), 
     @final:= @[email protected] 
FROM (select B.author_id, 
      count(book_name) qty 
     FROM author A , BOOK B 
     WHERE A.author_id = B.author_id 
     GROUP BY b.author_id) C , 
     author A, 
     BOOK B 
WHERE A.author_id = B.author_id 
    AND B.author_id = C.Author_id 
    AND date_release BETWEEN NOW() - INTERVAL 20 YEAR 
         AND NOW() 
GROUP BY c.author_id 
HAVING contar > 0 
+0

あなたはセレクトでセットを使用できますか? –

+0

SQL構文にエラーがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックし、適切な構文を使用してください。 ' –

+0

@JuanCarlosOropezaを正しく設定してください。私はストアドプロシージャのように思っていた! –

関連する問題