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

値が列で交換される場合、MySQLは2列でグループ化されます

    各行の「スレッド」を決定する1つの方法は、 CONCAT() LEAST GREATEST 同じ2つの数字の。

    次に、GROUP BYを実行できます 「スレッド」で、最新のgenerated_timeを取得します 。 HAVING 句では、少なくとも1つの'INCOMING'を持つ「スレッド」のみを除外します。 'REVIEW'のメッセージ タイプ。

    DBフィドルで表示

    SELECT m1.*
    FROM   message AS m1
           JOIN (SELECT Concat(Least(m.from_number, m.to_number), '|',
                                                          Greatest(m.from_number,
                                                          m.to_number))
                                                  AS
                        thread,
                        Max(m.generated_time)
                                                  AS max_generated_time
                 FROM   message AS m
                 GROUP  BY thread
                 HAVING Sum(m.direction = 'INCOMING'
                            AND m.type = 'REVIEW')) AS dt
             ON dt.thread = Concat(Least(m1.from_number, m1.to_number), '|',
                                             Greatest(m1.from_number, m1.to_number))
                AND dt.max_generated_time = m1.generated_time;
    

    結果

    | id  | to_number    | from_number  | message         | direction | type   | generated_time      |
    | --- | ------------ | ------------ | --------------- | --------- | ------ | ------------------- |
    | 3   | +15005550004 | +16232950692 | How are you ?   | OUTGOING  |        | 2019-07-13 21:15:00 |
    | 5   | +16232950692 | +15005550001 | Have a nice day | INCOMING  | REVIEW | 2019-07-12 12:17:00 |
    

    補足:

    1. 上記のアプローチ(および現在のスキーマ設計)ではインデックスを使用できないため、パフォーマンスが向上しません
    2. 2つの追加のマスターテーブルを作成して、スキーマを再設計したいと思います。 1つのマスターテーブルに電話番号が格納されます:phone_id 、およびnumber
    3. 別のマスターテーブルには、phone_idを含む「スレッド」が格納されます。 値とthread_id 。その後、このthread_idを使用できます messageで 電話番号を保存する代わりに、テーブル。



    1. jspページを介してデータベース上の2つの異なるテーブルにフォームデータを挿入します

    2. Mysql:他のSQLスクリプトファイルからSQLスクリプトファイルを呼び出す方法は?

    3. MySQLストアドプロシージャをどのようにデバッグしますか?

    4. phpファイルのエラー