-1

データベースからメッセージを取得し、メッセージごとに 1 行の受信トレイ スタイルで表示する PHP スクリプトがあります。各メッセージは、2 人のユーザー間の会話の一部です。現時点での問題は、会話内のメッセージごとに 1 つの新しいメッセージが出力に返されることです。

それが理にかなっている場合は?クエリのコードは次のとおりです。

 $sql_select_messages = $db->query( ... );

引数は次のクエリ文字列です。

SELECT m.admin_message, a.name, u.username AS sender_username, 
    m.* FROM " . DB_PREFIX . "messaging m
LEFT JOIN " . DB_PREFIX . "items a ON a.items_id=m.items_id
LEFT JOIN " . DB_PREFIX . "users u ON u.user_id=m.sender_id
WHERE m.receiver_id='" . $session->value('user_id') . "' AND m.receiver_deleted=0" .
    (($page == 'summary') ? " AND m.is_read=0" : '') . "
ORDER BY " . $order_field . " " . $order_type . " LIMIT " . $start . ", " . $limit

の部分:

m.* FROM " . DB_PREFIX . "messaging m

次のような列を含む mySQL 行からデータを選択します

topic_id

message_id

私がやろうとしているのは、上記の mySQL クエリが topic_id ごとに 1 つの結果のみを返し (同じ番号の topic_id が複数ある可能性があるため)、それと組み合わせて message_id の LATEST (最大番号) のみを返すようにすることです。

したがって、基本的に次の場合:

================
topic_id | message_id
================
15         10
15         11
15         12
19         02
19         03
19         04

mySQL が 15/12 と 19/04 を返すようにしたいだけです。上記の mySQL 選択クエリでそれを行うにはどうすればよいですか?

どうもありがとうございました :)

4

3 に答える 3

0

クエリは次のようになります

SELECT m.admin_message, a.name, u.username sender_username, m.*
  FROM 
(
  SELECT MAX(message_id) message_id
    FROM messaging 
   WHERE ... -- < all your where conditions go here
   GROUP BY topic_id
) q JOIN messaging m ON q.message_id = m.message_id LEFT JOIN items a 
   ON a.items_id = m.items_id LEFT JOIN users u 
   ON u.user_id  = m.sender_id
 ORDER BY ... 
 LIMIT ...

これがSQLFiddleのデモです

PHP側では次のようになります

$sql = "SELECT m.admin_message, a.name, u.username sender_username, m.*
   FROM 
 (
   SELECT MAX(message_id)
     FROM " . DB_PREFIX . "messaging 
    WHERE m.receiver_id = '" . $session->value('user_id') . "' AND m.receiver_deleted = 0 " .
    (($page == 'summary') ? " AND m.is_read = 0" : '') . "
    GROUP BY topic_id
 ) q JOIN " . DB_PREFIX . "messaging m ON q.message_id = m.message_id LEFT JOIN " . DB_PREFIX . "items a 
    ON a.items_id = m.items_id LEFT JOIN " . DB_PREFIX . "users u 
    ON u.user_id  = m.sender_id
  ORDER BY " . $order_field . " " . $order_type . " LIMIT " . $start . ", " . $limit;
$sql_select_messages = $db->query($sql);
于 2013-08-01T23:05:14.537 に答える
0

2 つの列で並べ替え、それらの列をグループ化する必要があります。

次のスクリプトを SQL に追加します。

GROUP BY topic_id
ORDER BY topic_id DESC, message_id DESC

お役に立てれば。

于 2013-08-01T23:01:13.620 に答える