Php 在每个小组中获得最后一行?

Php 在每个小组中获得最后一行?,php,mysql,sql,group-by,logic,Php,Mysql,Sql,Group By,Logic,你好,基本上我是想把facebook的信息系统复制到我的网站上 这就是逻辑。。。 “当用户1创建一条新消息发送给用户7时,将创建一个新线程,线程id为1(表:messages\u thread),并在表:messages中插入一个新条目,即消息id为1(表:messages)。当用户7回复用户1的消息时,将创建消息2,线程id为1。” 现在,当用户1创建一条发送给用户7的新消息时,线程2被创建,消息3被创建。当用户7回复线程2时,消息4被创建(希望您能得到逻辑) 一切都很好。唯一的问题是我需要在

你好,基本上我是想把facebook的信息系统复制到我的网站上

这就是逻辑。。。 “当用户1创建一条新消息发送给用户7时,将创建一个新线程,线程id为1(表:messages\u thread),并在表:messages中插入一个新条目,即消息id为1(表:messages)。当用户7回复用户1的消息时,将创建消息2,线程id为1。”

现在,当用户1创建一条发送给用户7的新消息时,线程2被创建,消息3被创建。当用户7回复线程2时,消息4被创建(希望您能得到逻辑)

一切都很好。唯一的问题是我需要在线程中选择最新消息,但我在sql方面遇到了问题

我现在拥有的sql

SELECT max(message_id) message_id, m.thread_id, m.body, m.user_id,m.to_id, m.message_status, m.new, m.date, u.id, u.displayname, u.username, u.profile_img
FROM messages m INNER JOIN users u ON u.id = m.user_id
WHERE to_id = 7  AND (message_status = 'unread' or message_status='read' or message_status='saved') 
group by thread_id Order by message_id Desc LIMIT 10
生产这个

+------------+-----------+----------------------+---------+-------+----------------+-----+------------+----+--------------+----------+-------------+
| message_id | thread_id | body                 | user_id | to_id | message_status | new | date       | id | displayname  | username | profile_img |
+------------+-----------+----------------------+---------+-------+----------------+-----+------------+----+--------------+----------+-------------+
|          6 |         2 | Really nice          |       1 |     7 | read           |   0 | 1298617367 |  1 | Kenny  Blake | imkenee  | 28_1        |
|          4 |         1 | Whats good with you? |       1 |     7 | read           |   0 | 1298607438 |  1 | Kenny  Blake | imkenee  | 28_1        |
+------------+-----------+----------------------+---------+-------+----------------+-----+------------+----+--------------+----------+-------------+
这很好,但有一个小问题,它会选择每个组中的第一行,我会尝试选择每个组中最新的(最后一行)

我怎么做?这是桌子。谢谢

表:消息\u线程

+----+---------+----------------+-------------+-----------+---------------+-------------+------------+
| id | user_id | subject        | from_status | to_status | from_s_delete | to_s_delete | date       |
+----+---------+----------------+-------------+-----------+---------------+-------------+------------+
|  1 |       1 | Hey Kenny      | unread      | unread    |             0 |           0 | 1298607438 |
|  2 |       7 | Check out this | unread      | unread    |             0 |           0 | 1298617344 |
+----+---------+----------------+-------------+-----------+---------------+-------------+------------+
表消息

+------------+-----------+---------+-------+-----------------------------------------------------------+----------------+-----------------+-----+------------+
| message_id | thread_id | user_id | to_id | body                                                      | message_status | is_sent_deleted | new | date       |
+------------+-----------+---------+-------+-----------------------------------------------------------+----------------+-----------------+-----+------------+
|          1 |         1 |       1 |     7 | Whats good with you?                                      | read           |               0 |   0 | 1298607438 |
|          2 |         1 |       7 |     1 | Nothing Kenny just chilling. Whats up with you though???? | read           |               0 |   0 | 1298607473 |
|          4 |         1 |       1 |     7 | Just posted victor how are you man?                       | read           |               0 |   0 | 1298607956 |
|          5 |         2 |       7 |     1 | Look at this poem....                                     | read           |               0 |   0 | 1298617344 |
|          6 |         2 |       1 |     7 | Really nice                                               | read           |               0 |   0 | 1298617367 |
|          7 |         2 |       7 |     1 | Yea i know right :)                                       | unread         |               0 |   0 | 1298617383 |
+------------+-----------+---------+-------+-----------------------------------------------------------+----------------+-----------------+-----+------------+

将子查询中的线程分组,该子查询将返回每个线程的最后一条消息:

SELECT m.message_id, m.thread_id, m.body, m.user_id,
    m.to_id, m.message_status, m.new, m.date, u.id, u.displayname, u.username, u.profile_img
FROM messages m 
  INNER JOIN users u ON u.id = m.user_id
  INNER JOIN (
    SELECT MAX(message_id) MaxMsgIDForThread
    FROM messages
    WHERE to_id = 7
      AND (message_status = 'unread'
        or message_status='read'
        or message_status='saved') 
    GROUP BY thread_id
  ) g ON m.message_id = g.MaxMsgIDForThread
Order by m.message_id Desc
LIMIT 10
其中
可能需要移动到外部查询,此时它将拾取满足条件的最后一条消息,如果不满足条件,则将其移动到外部查询(如果您希望完全跳过线程)


您还应该考虑将消息状态存储为一个有助于比较的信息。

不能通过“BR/>”添加组的顺序。 但也许这是可行的:

SELECT max(message_id) message_id, MAX(m.thread_id), m.body, m.user_id,m.to_id, m.message_status, m.new, m.date, u.id, u.displayname, u.username, u.profile_img
FROM messages m INNER JOIN users u ON u.id = m.user_id
WHERE to_id = 7  AND (message_status = 'unread' or message_status='read' or message_status='saved') 
group by thread_id Order by message_id Desc LIMIT 10

从生成的结果来看,您不是在选择每个组的“最后一行”吗?当您使用SQL with order by DESC时,它会为每个线程选择最后一行。是的,这就是我需要的帮助,它安排了组,我需要选择每个组的最后一行+1,这只是为了格式化问题注:ORDER BY message_id。如果您想自己对结果进行排序,请保留它。这将不起作用,1)因为MySql拾取的消息行不会是最后一行,2)围绕
m.thread_id
MAX
不起任何作用,因为您正在按它进行分组。