質問: 基礎からのmysqlを読んでいます。 tb1でtosiの大きいものからの順位をつけるのが目的です。 ``` tb1 +------+--------+------+ | bang | nama | tosi | +------+--------+------+ | A101 | 佐藤 | 40 | | A102 | 高橋 | 28 | | A103 | 中川 | 20 | | A104 | 渡辺 | 23 | | A105 | 西沢 | 35 | +------+--------+------+ ``` ``` select a.nama,a.tosi,count(*) from tb1 as a join tb1 as b where a.tosi <= b.tosi group by a.bang; ``` と本に記載通り入力したところ ``` Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'db1.a.nama' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by ``` と言うエラーが出てきてしまいます。翻訳を見てもなぜエラーになるのかがわかりません。 これは何が原因でコードをどうすればいいのでしょうか?また#1とはどういう意味なのでしょうか? それとcount(*)で表示される数字がそのまま順位になるとの記載があったのですがa.tosi <= b.tosiだと逆になってしまうのではないのでしょうか? ``` a +------+--------+------+ | bang | nama | tosi | +------+--------+------+ | A101 | 佐藤 | 40 | | A102 | 高橋 | 28 | | A103 | 中川 | 20 | | A104 | 渡辺 | 23 | | A105 | 西沢 | 35 | +------+--------+------+ b +------+--------+------+ | bang | nama | tosi | +------+--------+------+ | A105 | 西沢 | 35 | | A105 | 西沢 | 35 | | A105 | 西沢 | 35 | | A105 | 西沢 | 35| | A105 | 西沢 | 35 | +------+--------+------+ ``` 西沢の例ですと、となるのでa.tosi <= b.tosiだとcountは4になり、順位が2にならないきがするのですが。
回答: エラーをgoogle翻訳してみました。 ``` SELECTリストの式#1はGROUP BY句にはなく、GROUP BY句のカラムに機能的に依存しない非集約カラム db1.a.namaを含みます。 これはsql_mode = only_full_group_byと互換性がありません ``` group by 句を指定した時には、select する項目はgroup byで指定されなければなりません。 select で指定している `a.nama,a.tosi`がgroup byで指定されていないからエラーなのです。 誤植には見えないので、こんな基本的なところが間違っている市販本は在り得ません。 多分、以下のような記述ではないでしょうか(joinは直積で表現) ``` select a.bang,a.nama,a.tosi,count(*) from tb1 as a , tb1 as b where a.tosi <= b.tosi group by a.bang,a.nama,a.tosi; ``` > > tb1でtosiの大きいものからの順位をつけるのが目的です。 > > 西沢の例ですと、となるのでa.tosi <= b.tosiだとcountは4 > > > にはならないですね。 表示するのは`a.tosi`ですから、それ以上のというのは35と45の2件です。 コメントに対しての説明で追記 (bang,nama)=(A105,西沢)の例で説明します。 where条件が無いとき | a.bang | a.nama | a.tosi | b.bang | b.nama | b.tosi | | --- | --- | --- | --- | --- | --- | | A105 | 西沢 | 35 | A101 | 佐藤 | 40 | | A105 | 西沢 | 35 | A102 | 高橋 | 28 | | A105 | 西沢 | 35 | A103 | 中川 | 20 | | A105 | 西沢 | 35 | A104 | 渡辺 | 23 | | A105 | 西沢 | 35 | A105 | 西沢 | 35 | where条件 a.tosi <= b.tosi のとき | a.bang | a.nama | a.tosi | b.bang | b.nama | b.tosi | | --- | --- | --- | --- | --- | --- | | A105 | 西沢 | 35 | A101 | 佐藤 | 40 | | A105 | 西沢 | 35 | A105 | 西沢 | 35 | 上記をaの項目でgroup by すると count(*)は2となる ※group by するときは、group by の無い状態で確認すると分かり易いですよ。