40

質問と呼ばれる次の表があります。

ID | asker 
1  | Bob
2  | Bob
3  | Marley

各アスカーを一度だけ選択したいのですが、同じ名前のアスカーが複数ある場合は、ID が最も高いものを選択します。したがって、期待される結果は次のとおりです。

ID | asker 
3  | Marley
2  | Bob

次のクエリを使用します。

SELECT * FROM questions GROUP by questions.asker ORDER by questions.id DESC

次の結果が得られます。

ID | asker 
3  | Marley
1  | Bob

最後のボブではなく、最初に遭遇した「ボブ」を選択します。

4

7 に答える 7

62

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
于 2013-03-13T16:01:24.937 に答える
20

通常、MySQL では昇順レコードのみによるグループ化が許可されます。したがって、グループ化する前にレコードを並べ替えることができます。

選択する *
から (
  選択する *
  質問から
  ID DESC で注文
) AS の質問
GROUP BY question.asker
于 2014-06-13T10:38:51.807 に答える
4

GROUP BYレコードは、を使用してグループ化しMAX()、ごとに最大IDを取得する必要がありますasker

SELECT  asker, MAX(ID) ID
FROM    TableName
GROUP   BY asker

出力

╔════════╦════╗
║ ASKER  ║ ID ║
╠════════╬════╣
║ Bob    ║  2 ║
║ Marley ║  3 ║
╚════════╩════╝
于 2013-03-13T16:01:20.103 に答える
3

MAX(ID) を使用して必要な結果を取得することについて、他の人は正しいです。クエリが機能しない理由が気にORDER BYなる場合はGROUP BY .

于 2013-03-14T04:08:17.383 に答える