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