-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 的最新(最高数字)。

所以基本上如果有:

================
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

您需要按两列排序,并将这些列分组。

将以下脚本附加到您的 SQL。

GROUP BY topic_id
ORDER BY topic_id DESC, message_id DESC

希望这可以帮助。

于 2013-08-01T23:01:13.620 回答
0

简单地:

SELECT topic_id, MAX(message_id)
FROM test
GROUP BY topic_id

http://sqlfiddle.com/#!2/271de/2/0

于 2013-08-01T23:11:47.553 回答
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 回答