sql >> データベース >  >> RDS >> Mysql

最新のメッセージのSQLクエリ

    John Wooが方向性がないことを明らかにしたので、これが私の新しい答えです:

    select *
    from msgsList
    where (least(msg_from, msg_to), greatest(msg_from, msg_to), msg_time)       
    in 
    (
        select 
           least(msg_from, msg_to) as x, greatest(msg_from, msg_to) as y, 
           max(msg_time) as msg_time
        from msgsList 
        group by x, y
    );
    

    出力:

    | MSG_ID | MSG_FROM | MSG_TO |    MSG |                       MSG_TIME |
    ------------------------------------------------------------------------
    |      1 |        1 |      2 |  hello | January, 23 2010 17:00:00-0800 |
    |      5 |        1 |      3 | me too | January, 23 2012 00:15:00-0800 |
    |      6 |        3 |      2 |  hello | January, 23 2012 01:12:12-0800 |
    

    この入力の場合:

    create table msgsList
    (
      msg_id int,
      msg_from int, 
      msg_to int,
      msg varchar(10),
      msg_time datetime
    );
    
    insert into msgslist VALUES
    
    (1, 1, 2, 'hello', '2010-01-23 17:00:00'),      -- shown
    (2, 2, 1, 'world', '2010-01-23 16:00:00'),
    
    (3, 3, 1, 'i am alive', '2011-01-23 00:00:00'),
    (4, 3, 1, 'really', '2011-01-22 23:15:00'),
    (5, 1, 3, 'me too', '2012-01-23 00:15:00'),     -- shown
    
    (6, 3, 2, 'hello', '2012-01-23 01:12:12');      -- shown
    

    SQLFiddleデモ

    ANSI SQLがお好みの場合、その方法は次のとおりです。 http:// sqlfiddle .com /#!2 / 0a575 / 19

    select *
    from msgsList z
    where exists
    (
        select null
        from msgsList
        where 
          least(z.msg_from, z.msg_to) = least(msg_from, msg_to)
          and greatest(z.msg_from, z.msg_to) = greatest(msg_from, msg_to)
        group by least(msg_from, msg_to), greatest(msg_from, msg_to)
        having max(msg_time) = z.msg_time  
    ) ;
    


    1. SQL select returnの値を置き換える方法は?

    2. CentOSにmysqlclientをインストールできません

    3. Dateはmysqlのキーワードですか?

    4. WindowsにmysqlclientPythonパッケージをインストールできません