7

データベースからいくつかの会話を引き出しています。それらはuser_from列によってグループ化されています。

現在、最も古いメッセージが出力されます。最新のメッセージを表示したい。

これを行う最も簡単な方法は何ですか?

SELECT *
FROM (`mail`)
JOIN `users` ON `users`.`id` = `mail`.`user_from`
JOIN `users_info` ON `users_info`.`user_id` = `mail`.`user_from`
WHERE `user_to` =  '1'
GROUP BY `user_from`
ORDER BY `mail`.`date` desc

メールテーブル

ここに画像の説明を入力

ユーザー テーブル (スニペット)

ここに画像の説明を入力

これは現在の作業コードです。SecretAgentは、代理店からのメールよりも新しいメッセージを送信しましたが、代わりにそれが表示されます ここに画像の説明を入力

4

1 に答える 1

4

GROUP BY残念ながら、MySQLは句の内容について非常に寛大であり、すべての列をに含めない限り、信頼性の低い結果が生成されますGROUP BY。結合クエリでの使用は推奨さSELECT *れていませんが、ここではそのままにしておきます。あなたがする必要があるのは、残りの列に対して結合された、日付ごとにユーザーの最新のメッセージを取得するサブクエリ結合を実行することです。

SELECT 
  /* Don't actually do this. Be explicit about columns and assign aliases where their names collide */
  users.*,
  users_info.*,
  mail.*
FROM
  `users`
  JOIN `mail` ON `users`.`id` = `mail`.`user_from`
  JOIN `users_info` ON `users_info`.`user_id` = `mail`.`user_from`
  /* Joined subquery gets most recent message from each user */
  JOIN (
    SELECT  user_from, MAX(date) AS date
    FROM mail
    WHERE user_to = '1'
    GROUP BY user_from
    /* Joined back to the main mail table on user_from and date */
  ) most_recent ON mail.user_from = most_recent.user_from AND mail.date = most_recent.date
  WHERE `user_to` =  '1'

1つだけではなく、すべての最新の送信者を表示するように[更新]を編集します。

于 2013-01-23T14:19:21.010 に答える