いくつかの列と値を持つテーブル T があります
T
========================
id | name | g1 | g2
=========================
10 | abc | 1 | 1
14 | abc | 1 | 0
33 | abc | 1 | 0
42 | def | 1 | 0
52 | def | 1 | 1
63 | def | 2 | 0
66 | def | 2 | 0
67 | def | 2 | 0
74 | def | 1 | 0
そして、group by句ですべての個別の行を選択したい
私のクエリは
select *
from T
group by name
having max(g2) = 0
私の期待される結果は
========================
id | name | g1 | g2
=========================
14 | abc | 1 | 0
33 | abc | 1 | 0
42 | def | 1 | 0
63 | def | 2 | 0
66 | def | 2 | 0
67 | def | 2 | 0
74 | def | 1 | 0
** 各グループに対して where 句を追加する必要があるため、max(g2) を追加しました。:D 回答ありがとうございます。リターンを制限するために集計が必要です(節を持っています)。別の回避策は、サブクエリを使用することです
各グループの最初の行のみを返す私のMySQLによって
========================
id | name | g1 | g2
=========================
14 | abc | 1 | 0
42 | def | 1 | 0
他の列( id および g1 )のすべての違いを無視します。
他の DBMS (oracle と MsSQL、または MySQL ) を使用したことを覚えているので、クエリが上記の期待される結果を返すことを期待できます。すべての異なる行を返します。
または、変更するmySQLの設定はありますか??
私はすでに試し SET sql_mode=ONLY_FULL_GROUP_BY
ましたが、列を指定する通知を表示するだけです。私の理解では、group by句で列名を指定しないことは、異なる列値を持つすべての行を表示することです。
または、sql_mode 設定を指定する必要がありますか?? または少なくとも、MySQL がグループの最初の行のみを返す理由 ???
set @@global.sql_mode= 'STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER'
set @@sql_mode=''
ご回答ありがとうございます。