2016-12-24 11 views
2

私はfrom,to,messagetimeの列を持つテキストメッセージのようなテーブルを持っています。私は2つの数字(fromto)の間の最新のレコードをに関係なくに問い合せようとしています。ここでMySQL:注文に関係なく2列でグループ化

がテーブルの例である:

+--------------+-----------------+--------------------+--------------+ 
| from   | to    | message   | time   | 
+--------------+-----------------+--------------------+--------------+ 
| 555-1234  | 555-9876  | I'll be there.  | 06:00  | 
| 555-9876  | 555-5555  | message3   | 05:30  | 
| 555-9876  | 555-1234  | Bring beer   | 05:00  | 
| 555-9876  | 555-1234  | My place at 8pm | 04:00  | 
| 555-9876  | 555-5555  | message2   | 03:45  | 
| 555-5555  | 555-9876  | message1   | 03:30  | 
| 555-9876  | 555-1234  | Are you coming? | 03:00  | 
| 555-1234  | 555-9876  | Yeah, what's up? | 02:00  | 
| 555-9876  | 555-1234  | Are you there?  | 01:00  | 
+--------------+-----------------+--------------------+--------------+ 

私はこの例から、ちょうど次のレコードを取得したい:

+--------------+-----------------+--------------------+--------------+ 
| from   | to    | message   | time   | 
+--------------+-----------------+--------------------+--------------+ 
| 555-1234  | 555-9876  | I'll be there.  | 06:00  | 
| 555-9876  | 555-5555  | message3   | 05:30  | 
+--------------+-----------------+--------------------+--------------+ 

は、私はこれらを求めるにはどうすればよいですか?

答えて

0
SELECT t1.* 
FROM yourTable t1 
INNER JOIN 
(
    SELECT LEAST(`from`, `to`) AS `from`, 
      GREATEST(`from`, `to`) AS `to`, 
      MAX(`time`) AS `max_time` 
    FROM yourTable 
    GROUP BY LEAST(`from`, `to`), 
      GREATEST(`from`, `to`) 
) t2 
    ON LEAST(t1.`from`, t1.`to`) = t2.`from` AND 
     GREATEST(t1.`from`, t1.`to`) = t2.`to` AND 
     t1.`time` = t2.`max_time` 

ところで、あなたのカラムには、fromというMySQLキーワードの名前を付ける理由は何ですか?別の名前を使用してください。

+0

Downvoterでサブクエリを使用coynd:フィードバックを残してください。 –

+0

内部結合のみが双方向のレコードと会話を返しますか?私が与えた例はこれらのものしか持っていないが、ユースケースは必ずしもそうではない。また、実際のコードを使用するのではなく、実際に2つのテーブルを使用する代わりに 'from'を使用しました。これは、例を単純化するために2回現れます。簡単な質問をし、エスケープ文字( ')を使用する有効な答えを強制的にユースケースをダムダウンするよりも良いと思った。 – Bing

+0

@Bingいいえ、「INNER JOIN」はそれとは関係ありません。私はあなたの質問をして、フィードバックを与えることをお勧めします。 –

0

あなたはmaxとタプル

select * from my_table 
where (from, to, time) in (select from, to, max(time) 
          from my_table 
          group by from, to) 
+0

これは同じ値のペアに対して 'from、to'を' to、from'とは違うものとして扱うので問題になるかもしれません。 –

+0

@TimBiegeleisenありがとう..私は知っている..しかし、私は基本的にどのようにタプル、サブクエリとグループを使用してこれらの値を取得するための提案です(私はOPの本当の必要性を知らない) – scaisEdge

0
select * 
from messages m1 
where time = greatest((
    select max(time) 
    from messages m2 
    where m2.from = m1.from 
     and m2.to = m1.to 
),(
    select max(time) 
    from messages m2 
    where m2.from = m1.to 
     and m2.to = m1.from 
)) 

http://rextester.com/RDTZAK70241

関連する問題