先日、うちのサイトをMySQL5.5から5.7に変更したんですけど、どうやら一部記事にエラーが出ていたようです。
Expression #21 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'dataBaseName.freo_category_sets.category_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=onry_full_group_by
エラー出現条件はMySQL5.7及び関連エントリープラグイン導入です。
原因
まぁ見ての通り、SQL文のGROUP BY句でエラーってますね。
どうやらMySQL5.7ではデフォルトでsql_modeにonly_full_group_byが入っているようです。
ちなみにうちで使っているさくらインターネット(スタンダード)ではこんな感じになってました。
見ての通りですね。
どうやら一意になるcolumnをGROUP BY句にちゃんと指定しないとだめよってことらしいです(たぶん
解決
その1(安易)
とりあえず安易な解決策としてはsql_modeを5.5のときと同じに設定し直すっていう手段があります(うちの場合は何も設定されてませんでした)
SET GLOBAL sql_mode = '';
……なのですが、前述の通りうちのサーバーはレンタルサーバーなのでmy.cnfとか好きにいじれません(ユーザーディレクトリに置けるようなのを見た気がするけど、再起動できないからね)
その2(正攻法)
仕方ないのでどこが原因のソースなのか調べました。
んでそいつは公式で配布されている『関連エントリープラグイン』でしたね。
display.entry_relate.php:81行(ver1.3.0段階)
$stmt = $freo->pdo->prepare('SELECT id, user_id, created, modified, approved, restriction, password, status, display, comment, trackback, code, title, tag, datetime, close, file, image, memo, text, category_id, entry_id FROM ' . FREO_DATABASE_PREFIX . 'entries LEFT JOIN ' . FREO_DATABASE_PREFIX . 'category_sets ON id = entry_id WHERE id <> :id AND approved = \'yes\' AND (status = \'publish\' OR (status = \'future\' AND datetime <= :now1)) AND (close IS NULL OR close >= :now2) ' . $condition . ' GROUP BY id ORDER BY datetime DESC LIMIT :limit');
を
$stmt = $freo->pdo->prepare('SELECT id, user_id, created, modified, approved, restriction, password, status, display, comment, trackback, code, title, tag, datetime, close, file, image, memo, text, category_id, entry_id FROM ' . FREO_DATABASE_PREFIX . 'entries LEFT JOIN ' . FREO_DATABASE_PREFIX . 'category_sets ON id = entry_id WHERE id <> :id AND approved = \'yes\' AND (status = \'publish\' OR (status = \'future\' AND datetime <= :now1)) AND (close IS NULL OR close >= :now2) ' . $condition . ' GROUP BY id, user_id, created, modified, approved, restriction, password, status, display, comment, trackback, code, title, tag, datetime, close, file, image, memo, text, category_id, entry_id ORDER BY datetime DESC LIMIT :limit');
に変更すればいいです。
変更箇所はSELECT句とGROUP BY句を一致させただけです。
おわり
まぁfreo本体側は関係なかったし、対象コードも自分の環境では1箇所でしたのですぐ対処できてよかったです。
他のプラグインなんかでもGROUP BY句を使っていたら書き方の関係でもしかしたらエラーになるかもしれませんが、同様に対処すればいいと思います。
ちなみにこれ、別にsql_modeに指定されてなくてもこの修正した書き方で問題ないんだよね……?
関連エントリー
コメント
- コメントはまだありません。