id
それぞれの最後asker
が必要な場合は、集計関数を使用する必要があります。
SELECT max(id) as id,
asker
FROM questions
GROUP by asker
ORDER by id DESC
異常な結果が得られた理由は、MySQLが拡張機能を使用してGROUP BY
おり、選択リスト内のアイテムを集約せず、GROUPBY句に含めないようにするためです。ただし、MySQLは返される値を選択できるため、これは予期しない結果につながる可能性があります。(GROUP BYに対するMySQL拡張機能を参照してください)
MySQLドキュメントから:
MySQLはGROUPBYの使用を拡張して、選択リストがGROUPBY句で指定されていない非集計列を参照できるようにします。...この機能を使用すると、不要な列の並べ替えやグループ化を回避して、パフォーマンスを向上させることができます。ただし、これは主に、GROUPBYで指定されていない各非集計列のすべての値が各グループで同じである場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、同じでない限り、選択される値は不確定です。さらに、各グループからの値の選択は、ORDERBY句を追加しても影響を受けません。結果セットのソートは値が選択された後に行われ、ORDERBYはサーバーが選択する値に影響を与えません。
ここで、テーブルから返す必要のある他の列があるが、GROUP BY
取得できる結果に一貫性がないためにそれらを追加したくない場合は、サブクエリを使用して追加できます。(デモ)
select
q.Id,
q.asker,
q.other -- add other columns here
from questions q
inner join
(
-- get your values from the group by
SELECT max(id) as id,
asker
FROM questions
GROUP by asker
) m
on q.id = m.id
order by q.id desc