sql >> データベース >  >> RDS >> Mysql

MySqlでクエリを実行するときのonly_full_group_byに関連するエラー

    group_idを追加するだけです GROUP BYへ 。

    SELECTの場合 GROUP BYの一部ではない列を作成する グループ内のその列には複数の値が存在する可能性がありますが、結果には単一の値用のスペースしかありません。したがって、データベースは通常 これらの複数の値を1つの値にする方法を正確に伝える必要があります。通常、これはCOUNT()のような集計関数を使用して行われます。 、SUM()MAX() など...私は通常と言います 他のほとんどの一般的なデータベースシステムがこれを主張しているからです。ただし、バージョン5.7より前のMySQLでは、デフォルトの動作は文句を言わず、任意に任意の値を選択するため、より寛容でした。 ! ANY_VALUE()もあります 以前と同じ動作が本当に必要な場合は、この質問の別の解決策として使用できる関数。この柔軟性は非決定論的であるためコストがかかります。したがって、それを必要とする非常に正当な理由がない限り、この柔軟性はお勧めしません。 MySQLは現在only_full_group_byをオンにしています 正当な理由でデフォルトで設定されているので、それに慣れてクエリを準拠させるのが最善です。

    では、なぜ上記の私の簡単な答えですか?私はいくつかの仮定をしました:

    1)group_id ユニークです。合理的なようです、結局のところ「ID」です。

    2)group_name もユニークです。これは、そのような合理的な仮定ではないかもしれません。これが当てはまらず、group_namesが重複している場合 次に、私のアドバイスに従ってgroup_idを追加します GROUP BYへ 、同じ名前のグループの結果に別々の行が含まれるようになるため、以前よりも多くの結果が得られるようになる場合があります。私にとって、これは、データベースが値を任意に静かに選択しているため、これらの重複グループを非表示にするよりも優れています。

    複数のテーブルが関係している場合は、すべての列をテーブル名またはエイリアスで修飾することもお勧めします...

    SELECT 
      g.group_id AS 'value', 
      g.group_name AS 'text' 
    FROM mod_users_groups g
    LEFT JOIN mod_users_data d ON g.group_id = d.group_id 
    WHERE g.active = 1 
      AND g.department_id = 1 
      AND g.manage_work_orders = 1 
      AND g.group_name != 'root' 
      AND g.group_name != 'superuser' 
    GROUP BY 
      g.group_name, 
      g.group_id 
    HAVING COUNT(d.user_id) > 0 
    ORDER BY g.group_name
    


    1. ロック待機タイムアウトの修正が超過しました。 'スタックしたMysqlテーブルのトランザクションを再開してみますか?

    2. カタログ、スキーマ、ユーザー、およびデータベースインスタンス間の関係

    3. ADO.NETからOracleを呼び出すときに、複数のselectステートメントをバッチ処理する

    4. PostgreSQL14の最高の新機能