MySQL ONLY_FULL_GROUP_BY
エラーが発生しましたか? このガイドでは、初心者と経験豊富な MySQL ユーザーの両方に明確な説明と実践的なソリューションを提供します。
ONLY_FULL_GROUP_BY
ONLY_FULL_GROUP_BY
は、標準の GROUP BY
動作を強制する MySQL 設定です。 この設定を有効にすると、SELECT
ステートメントは次のルールに従う必要があります:
SELECT
内のすべての列は GROUP BY
: に存在する必要があります。選択されたすべての列は GROUP BY
句にも含まれている必要があります。GROUP BY
にない列には集計関数が必要です (例: COUNT
、SUM
、AVG
、MAX
、MIN
)。GROUP BY
句の列に機能的に依存している必要があります。orders
:
<code class="language-sql">CREATE TABLE orders ( id INT, customer_name VARCHAR(100), product VARCHAR(100), amount DECIMAL(10,2) ); INSERT INTO orders VALUES (1, 'John', 'Laptop', 1000), (2, 'John', 'Mouse', 20), (3, 'Mary', 'Keyboard', 50), (4, 'Mary', 'Monitor', 200);</code>
このクエリはエラーをトリガーします:
<code class="language-sql">SELECT customer_name, product, SUM(amount) FROM orders GROUP BY customer_name;</code>
問題は? product
は選択されていますが、グループ化されていません。 MySQL は、顧客ごとにどの製品を表示するかを決定できません (顧客は複数の商品を購入している可能性があるため)。
解決策 1: MySQL 設定を変更する
簡単な修正 (セッションレベル):
<code class="language-sql">SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));</code>
恒久的な修正 (グローバルレベル):
<code class="language-sql">SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';</code>
解決策 2: クエリを調整する
GROUP BY
にすべての列を含めます:<code class="language-sql">SELECT customer_name, product, SUM(amount) FROM orders GROUP BY customer_name, product;</code>
MAX
、MIN
):<code class="language-sql">SELECT customer_name, MAX(product) as product, SUM(amount) as total_amount FROM orders GROUP BY customer_name;</code>
<code class="language-sql">SELECT o.* FROM orders o INNER JOIN ( SELECT customer_name, SUM(amount) as total_amount FROM orders GROUP BY customer_name ) grouped ON o.customer_name = grouped.customer_name;</code>
<code class="language-sql">SELECT category, MAX(product_name) as top_product, COUNT(*) as total_orders, SUM(amount) as total_sales FROM sales GROUP BY category;</code>
<code class="language-sql">SELECT customer_id, MIN(first_name) as first_name, MIN(last_name) as last_name, COUNT(*) as total_purchases, SUM(purchase_amount) as total_spent, AVG(purchase_amount) as avg_purchase_amount FROM customer_purchases GROUP BY customer_id;</code>
一意の ID がありません: 不正解: SELECT id, customer_name, COUNT(*) FROM orders GROUP BY customer_name;
正解: SELECT MIN(id) as first_order_id, customer_name, COUNT(*) FROM orders GROUP BY customer_name;
複雑な結合: GROUP BY
との結合を使用する場合は、集約を慎重に検討してください。 集計関数を適切に使用するか、サブクエリを使用してクエリをリファクタリングします。
ONLY_FULL_GROUP_BY
を保持することを検討してください。SELECT @@sql_mode;
SHOW VARIABLES LIKE 'sql_mode';
SHOW GRANTS;
ONLY_FULL_GROUP_BY
を有効にしておくべき場合無効にすることは魅力的ですが、新しいプロジェクト、SQL 標準への準拠、および微妙なクエリ エラーの防止のために、ONLY_FULL_GROUP_BY
をアクティブにし続けることを検討してください。
ONLY_FULL_GROUP_BY
エラーは、最初はイライラしますが、より良いクエリ設計を促進します。 その目的を理解し、正しいソリューションを実装することで、MySQL のスキルとコードの保守性が向上します。 正確なデータの選択と適切な集計関数を優先します。コーディングを楽しんでください!
以上がMySQL ONLY_FULL_GROUP_BY エラー: 簡単な修正とベスト プラクティスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。