0

メッセージングスレッド(つまり、送信者/受信者)に対してMySQLクエリを作成しようとしています。

フィールドのあるテーブルがあります(msg_id = 123456のような一意の6桁のID)。この(msg_id)フィールドには、(msg応答ごとに)多くの行が含まれる場合があり、各行はスレッドのように同じ(msg_id)になります。したがって、bobがfredにメッセージを送信し始めたとしましょう。したがって、テーブルのスレッドは次のようになります(要点を説明するための大まかな例):-

+---------+---------------------------+--------------------------+------------------------+------------+----------+
| msg_id  | sender_email              | recipient_email          | sender_msg             | cur_date   | cur_time |
+---------+---------------------------+--------------------------+------------------------+------------+----------+
| 3189855 | bob@hotmail.com           | fred@yahoo.com           | hi fred, how are you?  | 2013-03-10 | 17:12:18 |
| 3189855 | fred@yahoo.com            | bob@hotmail.com          | hi bob, I am great     | 2013-03-10 | 17:15:20 |
| 3189855 | bob@hotmail.com           | fred@yahoo.com           | hi fred, good to hear  | 2013-03-10 | 17:20:10
| 6749672 | jenny@barclay.cc          | fred@yahoo.com           | some other message     | 2013-03-10 | 14:52:49 |
+---------+---------------------------+--------------------------+------------------------+------------+----------+

ボブまたはフレッドの電子メール受信ボックスを表示するとき、それぞれの一意の(msg_id)を最新(cur_date、cur_time)で表示して、最新のmsg/msg応答が受信ボックスリストの一番上になるようにします。

それで、Fredがほとんどのメッセージを持っているので、Fredsメールボックスに焦点を合わせましょう。受信トレイの電子メールを出力するときに、クエリで次の結果を表示したいのですが。

+---------+---------------------------+--------------------------+------------------------+------------+----------+
| msg_id  | sender_email              | recipient_email          | sender_msg             | cur_date   | cur_time |
+---------+---------------------------+--------------------------+------------------------+------------+----------+
| 3189855 | bob@hotmail.com           | fred@yahoo.com           | hi fred, good to hear  | 2013-03-10 | 17:20:10 |
| 6749672 | jenny@barclay.cc          | fred@yahoo.com           | some other message     | 2013-03-10 | 14:52:49 |
+---------+---------------------------+--------------------------+------------------------+------------+----------+

したがって、クエリは各一意(msg_id)を取得し、一意(msg_id)ごとに最後の行を取得します(つまり、送信されたスレッドの最後のmsgであり、送信された最新のmsgになります)。それが理にかなっている場合。したがって、私の質問は、上記の結果を出すためにこのSQLクエリをどのように生成するかということです。私のアイデアは以下のとおりですが、機能しません:-

SELECT * FROM inbox_table WHERE (recipient_email='fred@yahoo.com' AND ORDER BY cur_date DESC, cur_time DESC) GROUP BY msg_id ORDER BY cur_date DESC, cur_time DESC;

どんなアイデアでも大歓迎です、そして私はこれをうまく説明したことを望みます。

4

2 に答える 2

1

おそらく、文字列を引用符で囲む必要があり、ORDER BY句は最後にある必要があり、1回だけです。

SELECT * FROM inbox_table WHERE 
   recipient_email='fred@yahoo.com' 
   GROUP BY msg_id ORDER BY cur_date DESC, cur_time DESC;

SELECTたとえば、句に集計関数を追加するのは理にかなっているかもしれませんCOUNT。そのため、スレッドに含まれるメッセージの数もわかります。

SELECT *,COUNT(msg_id) FROM inbox_table WHERE 
   recipient_email='fred@yahoo.com' 
   GROUP BY msg_id ORDER BY cur_date DESC, cur_time DESC;

msg_id最後に、名前をに変更することをお勧めしthread_idます。これは、意味をよりよくカバーしているためです。

時間ごとの最新のレコードが必要な場合は、次を使用します。

 SELECT *,MAX(CONCAT(cur_date,' ',cur_time)) FROM inbox_table WHERE 
   recipient_email='fred@yahoo.com' 
   GROUP BY msg_id
于 2013-03-10T19:04:28.783 に答える
0

このフィドルを確認してください。基本的に、文字列を引用せず、括弧WHEREは不要です。

于 2013-03-10T19:19:43.607 に答える