ubuntuを15.10から16.04にアップグレードしたとき、yii2プロジェクトにこのエラーがあります
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #3
of SELECT list is not in GROUP BY clause and contains nonaggregated column
'iicityYii.opportunity_conditions.money' which is not functionally dependent
on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
実行されたSQLは次のとおりです。
SELECT SUM(oc.money),op.id,oc.money,
op.mantaghe,
op.`time`, op.`id`, `op`.`logo`,
`pd`.`user_id`, `op`.`name`,
`pd`.`co_name`, `op`.`address`,
`op`.`project_type_id`, `op`.`state_id`
FROM `opportunity` op
INNER JOIN `profile_details` pd ON op.user_id=pd.user_id
INNER JOIN `opportunity_conditions` oc ON op.id=oc.opportunity_id
GROUP BY `op`.`id`
ORDER BY `op`.`id` DESC
私の問題を解決するには?
あなたの選択では、集計関数の合計と列名のセットがあり、エラーはgroup by句で列名の正しいリストを指定していないことを示しています。おそらく_profile_details, opportunity_conditions
_テーブルに関連して、グループに列名を追加する必要があります
また、,(opportunity.id),(opportunity_conditions.money), (opportunity.mantaghe),
がある理由_()
_合計が必要な場合は、すべての列に合計を追加する必要があります
_sum(opportunity.id), sum(opportunity_conditions.money),
_
sum(opportunity.mantaghe)、
それ以外の場合、thesが通常の列である場合、()なしで通常のsintaxを使用する必要があります
_opportunity.id, opportunity_conditions.money,opportunity.mantaghe,
_
可能なクエリを書き直そうとしました
_ SELECT SUM(opportunity_conditions.money),
`opportunity`.`id`,
`opportunity_conditions.money`,
`opportunity.mantaghe`,
`opportunity`.`time`,
`opportunity`.`logo`,
`profile_details`.`user_id`,
`opportunity`.`name`,
`profile_details`.`co_name`,
`opportunity`.`address`,
`opportunity`.`project_type_id`,
`opportunity`.`state_id`
FROM `opportunity`
INNER JOIN `profile_details` ON `opportunity`.`user_id`= `profile_details`.`user_id` 7
INNER JOIN `opportunity_conditions` ON `opportunity`.`id`=`opportunity_conditions`.`opportunity_id`
GROUP BY`opportunity`.`id`, `profile_details`.`user_id`,`opportunity_conditions.money`,
ORDER BY `opportunity`.`id` DESC
_
必須の列名のグループ別(希望)
_GROUP BY`opportunity`.`id`, `profile_details`.`user_id`,`opportunity_conditions.money`,
_
以下を実行します。
Sudo mysql -u root -p
MySQLサーバーインスタンスのSQLモードを変更します。
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
別の方法は、MySQL構成を使用することです。 /etc/mysql/my.cnf
に移動します。
[mysqld]
のセクションを追加し、そのすぐ下にステートメントsql_mode = ""
を追加しますmysqlサービスを再起動します。
Sudo systemctl restart mysql
laravelでMySqlを使用するとconfig/database.phpファイルに移動し、配列MySqlモードでstrictをfalseに変更します。
'connections' => [
'mysql' => [
'driver' => 'mysql',
'Host' => env('DB_Host', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => false, //from true
'engine' => null,
],
],
この行をコピーして実行してください。それは私のために働いた。
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
解決策は、MySQL構成ファイルを編集することです。再起動するたびに構成が元に戻るためです...
Sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
そして追加
[mysqld]
sql-mode=""
その後、再起動します
Sudo systemctl restart mysql
Ubuntu 18.04で動作します。
Thx、これは私を助けましたが、これはそれを設定しません[〜#〜] permanently [〜#〜]で、再起動するたびに元に戻ります。
したがって、設定ファイル([mysqld]セクションの/etc/mysql/my.cnfなど)でこれを設定して、MySQLの再起動後も変更が有効になるようにする必要があります。
構成ファイル:/etc/mysql/my.cnf
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"