0

I am trying to get a users most current messages for each conversation. However my group by query doesnt seem to be bringing the correct rows back. Here is my data:

ID | MESSAGE | RELATED_ID | DATE_SENT
 2 | Hi      |     2      | 2013-02-21 16:03:00
 3 | Hii     |     2      | 2013-02-21 16:04:00
 4 | Hiii    |     2      | 2013-02-21 16:05:00
 5 | Hiiii   |     2      | 2013-02-21 16:06:00
 6 | Bye     |     6      | 2013-02-21 16:03:01
 7 | Byee    |     6      | 2013-02-21 16:04:01
 8 | Byeee   |     6      | 2013-02-21 16:05:01
 9 | Again   |     9      | 2013-02-21 16:03:02
 10| Againn  |     9      | 2013-02-21 16:04:02

The result i am looking for is:

ID | MESSAGE | RELATED_ID | DATE_SENT
 5 | Hiiii   |     2      | 2013-02-21 16:06:00
 8 | Byeee   |     6      | 2013-02-21 16:05:01
 10| Againn  |     9      | 2013-02-21 16:04:02

My current query is:

 SELECT MAX(ID), Message, Date_Sent, related_id FROM MESSAGES GROUP BY RELATED_ID LIMIT 0,100

The result that I get is:

ID | MESSAGE | RELATED_ID | DATE_SENT
 5 | Hi      |     2      | 2013-02-21 16:03:00
 8 | Bye     |     6      | 2013-02-21 16:03:01
 10| Again   |     9      | 2013-02-21 16:03:02

It seems to be getting the correct ID but not the correct data for that ID.

I would appreciate any help I can get on this.

4

2 に答える 2

9

サブクエリを使用してmax(id)for eachを選択し、related_idそれをテーブルに結合します。

select m1.id,
  m1.message,
  m1.related_id,
  m1.date_sent
from messages m1
inner join
(
  select max(id) MaxId, related_id
  from messages
  group by related_id
) m2
  on m1.id = m2.MaxId
  and m1.related_id = m2.related_id
LIMIT 0,100

SQL Fiddle with Demoを参照してください。このようにすると、SELECTリスト内の他の列に対して正しい値が返されるようになります。GROUP BYリスト内のすべての項目を集約しないか集約しない場合SELECT、MySQL は他の列の値を選択するため、予期しない結果が生じる可能性があります。(への MySQL 拡張機能をGROUP BY参照してください)

MySQL ドキュメントから:

MySQL は GROUP BY の使用を拡張して、選択リストが GROUP BY 句で指定されていない非集計列を参照できるようにします。... この機能を使用して、不要な列の並べ替えやグループ化を回避することで、パフォーマンスを向上させることができます。ただし、これは主に、GROUP BY で指定されていない各非集計列のすべての値が各グループで同じ場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。さらに、ORDER BY 句を追加しても、各グループからの値の選択に影響を与えることはできません。結果セットのソートは値が選択された後に行われ、ORDER BY はサーバーが選択する値には影響しません。

于 2013-02-22T12:03:59.473 に答える
-2

多分それはこのようなものであるべきです

MAX(ID)と置き換えますMAX(Date_Sent)

于 2013-02-22T12:04:53.030 に答える