2017-07-20 9 views
0

で「グループ機能の無効な使用」には、私のデータベースは次のようになります。私は2000年より後に映画を持っており、より多くを持っているディレクターを取得しようとする上記のクエリでははMySQLを使用したMySQL

+-----------------------+--------------------+------+--------+ 
|  moviesInfo  |     |  |  | 
+-----------------------+--------------------+------+--------+ 
| title     | director   | year | oscars | 
+-----------------------+--------------------+------+--------+ 
| BoBoiBoy: The Movie | Nizam Razak  | 2016 | 0  | 
| Inception    | Christopher Nolan | 2010 | 4  | 
| Interstellar   | Christopher Nolan | 2014 | 1  | 
| Munna Bhai M.B.B.S. | Rajkumar Hirani | 2003 | 0  | 
| My Dear Brother  | Ertem Egilmez  | 1973 | 0  | 
| Rocky     | John G. Avildsen | 1976 | 3  | 
| The Nights of Cabiria | Federico Fellini | 1957 | 1  | 
| The Sixth Sense  | M. Night Shyamalan | 1999 | 6  | 
| Tokyo Story   | Yasujirô Ozu  | 1953 | 0  | 
| Yojimbo    | Akira Kurosawa  | 1961 | 1  | 
+-----------------------+--------------------+------+--------+ 


select director from moviesInfo 
where MAX(year) > 2000 and SUM(oscars) > 2 
group by director; 

2オスカーよりも、私はエラーが発生します。

Invalid use of group function 

まだ私はこれを完全に理解していません。

期待出力GROUP BY aggregate functionsWHERE句で使用することはできません

+-------------------+ 
|  director  | 
+-------------------+ 
| Christopher Nolan | 
+-------------------+ 

答えて

3

だろう。 GROUP BYの後のHAVING句には、グループ化によって生成された値のセットを処理するため、これらの値を保持する必要があります。

あなたのクエリは次のようになります。

SELECT director 
FROM moviesInfo 
GROUP BY director 
HAVING MAX(year) > 2000 AND SUM(oscars) > 2 

更新

OPの要求では、これは上記のSQLクエリが実行されたか、大体、次のとおりです。

  1. GROUP BY句が教えてくれサーバーを使用して一致する行をグループ化します(すべての行 はフィルタリングするためにWHERE句がないためです)。次のようにグループは次のとおりです。

    +-----------------------+--------------------+------+--------+ 
    | title     | director   | year | oscars | 
    +-----------------------+--------------------+------+--------+ 
    | BoBoiBoy: The Movie | Nizam Razak  | 2016 | 0  | 
    +-----------------------+--------------------+------+--------+ 
    | Inception    | Christopher Nolan | 2010 | 4  | 
    | Interstellar   | Christopher Nolan | 2014 | 1  | 
    +-----------------------+--------------------+------+--------+ 
    | Munna Bhai M.B.B.S. | Rajkumar Hirani | 2003 | 0  | 
    +-----------------------+--------------------+------+--------+ 
    | My Dear Brother  | Ertem Egilmez  | 1973 | 0  | 
    +-----------------------+--------------------+------+--------+ 
    | Rocky     | John G. Avildsen | 1976 | 3  | 
    +-----------------------+--------------------+------+--------+ 
    | The Nights of Cabiria | Federico Fellini | 1957 | 1  | 
    +-----------------------+--------------------+------+--------+ 
    | The Sixth Sense  | M. Night Shyamalan | 1999 | 6  | 
    +-----------------------+--------------------+------+--------+ 
    | Tokyo Story   | Yasujirô Ozu  | 1953 | 0  | 
    +-----------------------+--------------------+------+--------+ 
    | Yojimbo    | Akira Kurosawa  | 1961 | 1  | 
    +-----------------------+--------------------+------+--------+ 
    
  2. HAVING句は、グループごとにMAX(year)SUM(oscars)を計算します。データは次のようになり、今:

    +-----------------------+--------------------+------+--------+-----------+-------------+ 
    | title     | director   | year | oscars | MAX(year) | SUM(oscars) | 
    +-----------------------+--------------------+------+--------+-----------+-------------+ 
    | BoBoiBoy: The Movie | Nizam Razak  | 2016 | 0  | 2016  | 0   | 
    +-----------------------+--------------------+------+--------+-----------+-------------+ 
    | Inception    | Christopher Nolan | 2010 | 4  | 2014  | 5   | 
    | Interstellar   | Christopher Nolan | 2014 | 1  |   |    | 
    +-----------------------+--------------------+------+--------+-----------+-------------+ 
    | Munna Bhai M.B.B.S. | Rajkumar Hirani | 2003 | 0  | 2003  | 0   | 
    +-----------------------+--------------------+------+--------+-----------+-------------+ 
    | My Dear Brother  | Ertem Egilmez  | 1973 | 0  | 1973  | 0   | 
    +-----------------------+--------------------+------+--------+-----------+-------------+ 
    | Rocky     | John G. Avildsen | 1976 | 3  | 1976  | 3   | 
    +-----------------------+--------------------+------+--------+-----------+-------------+ 
    | The Nights of Cabiria | Federico Fellini | 1957 | 1  | 1957  | 1   | 
    +-----------------------+--------------------+------+--------+-----------+-------------+ 
    | The Sixth Sense  | M. Night Shyamalan | 1999 | 6  | 1999  | 6   | 
    +-----------------------+--------------------+------+--------+-----------+-------------+ 
    | Tokyo Story   | Yasujirô Ozu  | 1953 | 0  | 1953  | 0   | 
    +-----------------------+--------------------+------+--------+-----------+-------------+ 
    | Yojimbo    | Akira Kurosawa  | 1961 | 1  | 1961  | 1   | 
    +-----------------------+--------------------+------+--------+-----------+-------------+ 
    
  3. 次に、HAVING上の条件が評価され、データセットは次のようになります。

    +-----------------------+--------------------+------+--------+-----------+-------------+ 
    | title     | director   | year | oscars | MAX(year) | SUM(oscars) | 
    +-----------------------+--------------------+------+--------+-----------+-------------+ 
    | Inception    | Christopher Nolan | 2010 | 4  | 2014  | 5   | 
    | Interstellar   | Christopher Nolan | 2014 | 1  |   |    | 
    +-----------------------+--------------------+------+--------+-----------+-------------+ 
    
  4. SELECT句は、あなたが期待する結果セットを生成するために使用されます。

上記の説明はGROUP BYクエリの背後にある理論モデルであることに注意してください。現実の世界では、MySQL(および他のRDBMS)は上記の手順を異なる順序で組み合わせて実行します。 WHEREHAVING句を組み合わせて(可能な場合)、一度に1行ずつ処理し、できるだけ早く処理を終了するためにできるだけ早くできるだけ多くの行をフィルタリングしようとします。

GROUP BYクエリcan contain only expressions

SELECT句備考:

  1. GROUP BY句中に存在します。
    例えば、director;
  2. は、GROUP BY aggregate functionsであり;
    例えばSUM(oscars),COUNT(*),AVG(year)などである。他の句にそれらが存在する必要はない。
  3. は、機能的にはGROUP BY句に存在する列に依存します。
    たとえば、GROUP BY句にテーブルのPKという列が含まれている場合、そのテーブルのすべての列は、そのグループのすべての行がそのテーブルのすべての列に対して同じ値を持つため、SELECT句に許可されます。

のは、上記の条件のいずれかに一致していないので、列titleyearoscarsSELECT句にはできないことを注意しましょう。 SELECT句にそれらを追加すると、無効なSQLが生成されます。その理由は明らかです。第2グループにはtitleの2つの異なる値があります。どちらを選択するのですか?

バージョン5.7.5より前のバージョンでは、MySQLはそのような無効なSQLクエリを受け入れましたが、その権利はreturn indeterminate resultsに予約されていました。これは、異なるマシン上の同じデータセットに対してクエリが実行された場合(またはデータがバックアップから復元された後)、結果が変更される可能性があることを意味します。

バージョン5.7.5以降、MySQLは無効なGROUP BYクエリを拒否します。

+0

ありがとう、おそらくHAVING節が何をしているのか説明できますか? – Ludisposed

+0

@Ludisposed 'HAVING'は、すべてのレコードの代わりに形成されたグループ上で動作する点を除いて、' WHERE'と似ています。彼のHAVING句は、ディレクターのレコードグループが2000年を過ぎて、オスカーの合計が2以上であるところを指しています。 –

+0

素晴らしいexplenation、私は今2回upvoteできないことが悲しいです。 – Ludisposed

関連する問題