2017-06-08 10 views
1

あなたが私を助けることができるなら、私はsqlite3でやや複雑な選択をする必要がありますか?Sqlite 3 select statemen

私は、次のフィールド保持「メッセージ」テーブルだ:

from | to | message_text | message_timestamp 

と行を:

a | b | Hi | 101 
a | b | How are you? | 103 
b | a | Fine,thanks | 104 
c | a | Hey dude! | 115 
a | b | I need to tell you something. | 1102 
d | b | Yo dude | 1234 
b | d | Yea dude, whatsup? | 1443 

私は時系列的順序で上記の会話からの最後のメッセージを選択したいのですがメッセージがフォームxからyに送信されたか、またはフォームyからxに送信されたかを無視することによって、xyまたはyxペアを考慮する必要があります。上記の例では、次のようになります。

b | d | Yea dude, whatsup? | 1443 
a | b | I need to tell you something. | 1102 
c | a | Hey dude! | 115 

ありがとう!!

+0

だけGROUPBY句に探して。期待しているようだ。 –

答えて

1

スカラー最小/最大トリックを使用して同じ論理グループにペアを共有するレコードを収集する1つのトリックです。以下のクエリでは、最も内側のサブクエリバケットは、たとえばbからdまでをdbと同じバケットに収集します。次に、これを集計して最新のタイムスタンプを見つけ、元のテーブルに戻って必要な行全体を取得します。

SELECT 
    m1.* 
FROM messages m1 
INNER JOIN 
(
    SELECT 
     t."from", 
     t."to", 
     MAX(t.message_timestamp) AS max_ts 
    FROM 
    (
     SELECT 
      MIN("from", "to") AS "from", 
      MAX("from", "to") AS "to", 
      message_text, 
      message_timestamp 
     FROM messages 
    ) t 
    GROUP BY 
     t."from", 
     t."to" 
) m2 
    ON MIN(m1."from", m1."to") = m2."from" AND 
     MAX(m1."from", m1."to") = m2."to" AND 
     m1.message_timestamp = m2.max_ts 
ORDER BY m1.message_timestamp DESC; 

注:はご遠慮下さいませんfromtoあなたの列に名前を付ける(またはテーブル、またはデータベース)のような使用のSQLキーワード。 fromを二重引用符で逃げて、クエリを機能させる必要がありました。

出力:

enter image description here

ここにデモ:

Rextester

(RextesterはSQLiteのをサポートしていないので、デモは、MySQLにある唯一の違いは、MINです。はLEASTに置き換えられ、列はエスケープされたsli ghtly違った。)

+0

ありがとう、ティム、きれいにやった! –

0

2つの一時結果、from/toと1、およびto/fromと一つに結合します。次に、最初の列の値が2番目の列の値よりも小さいことを強制して、重複を除外します。そして、あなたは、単にこれらの列の上にグループ化を使用することができます。

SELECT c1, 
     c2, 
     message_text, 
     max(message_timestamp) 
FROM (SELECT "from" AS c1, "to" AS c2, message_text, message_timestamp 
     FROM messages 
     WHERE "from" < "to" 

     UNION ALL 

     SELECT "to",   "from",  message_text, message_timestamp 
     FROM messages 
     WHERE "to" < "from" 
    ) 
GROUP BY c1, c2; 

bare columns in an aggregated queryを使用してSQLiteの3.7.11以降が必要です。)