-4

更新的问题:

这是数据

   m_to    m_from  m_id    m_time 
        5   5   1   1374769716
        5   5   2   1374771178
        5   5   3   1374771294
        5   5   4   1374771396
        5   5   5   1374771784
        1   5   6   1374772120
        1   5   7   1374773097
        5   1   8   1374773579
        5   1   9   1374774095
        5   1   10  1374774148
        1   5   11  1374777304
        444 5   12  1374779752
        5   444 13  1374780378
        5   5   14  1374781374
        5   5   15  1374832375
        444 5   16  1374837258
        5   444 17  1374837525
        5   444 18  1374838801
        444 5   19  1374838976
        1   5   20  1374842736
        5   5   21  1374842954
        444 5   22  1374843389
        5   5   23  1374843466
        1   5   24  1374843853
        1   5   25  1374848855
        444 5   26  1374848889
        5   5   27  1374848912
        1   5   28  1374849001
        5   5   29  1374849056
        444 5   30  1374850406

第一个是“m_to”,第二个是 m_from,第三个是 m_id,fourht 是 m_time

现在我想要的是,我想按 m_from 分组并按 m_time 排序。ut 将添加的新消息应该在顶部,下一行应该在第二个......等等

我用过。

SELECT m_from,m_time FROM messages WHERE m_to='5' GROUP BY m_from ORDER BY m_time DESC

但正在发生这样的事情

444
1
5

所以,它没有正确排序数据..

4

3 回答 3

0

如果您按一个(或多个)列进行分组,那么您必须对所有未分组的列执行某些操作才能使您的查询有意义。

你必须说出你想对所有分组值做什么。通常类似于 SUM()、AVG()、MIN()、MAX()、GROUP_CONCAT()

如果您按 m_from 分组,那么您将无法按 m_time 排序,因为 m_from 的所有记录都将分组在一起,而对于未分组的值,您将得到任意答案,因为您没有指定如何处理该组。

您可能希望使用聚合函数(例如 MAX(m_time))来获取 m_time 的最大值,然后对其进行排序。

我会建议类似的东西。

 SELECT MAX(m_id),m_from, MAX(m_time) as latest FROM messages 
    WHERE m_to='XXX' OR m_from='XXX' 
    GROUP BY m_from 
    ORDER BY latest DESC;
于 2013-07-26T15:55:08.780 回答
0

这似乎是源于SELECT *and的问题GROUP BYMySQL允许这种情况发生,但它可能会导致一些问题。

MySQL 扩展了 GROUP BY 的使用,以便选择列表可以引用未在 GROUP BY 子句中命名的非聚合列。这意味着前面的查询在 MySQL 中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在每个未在 GROUP BY 中命名的非聚合列中的所有值对于每个组都相同时很有用。服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的。此外,从每个组中选择值不会受到添加 ORDER BY 子句的影响。结果集的排序发生在选择值之后,并且 ORDER BY 不会影响服务器选择每个组中的哪些值。

至于获得你想要的数据,我认为对你有用:

SELECT * FROM `messages` ORDER BY m_from ASC, m_time DESC

如果你想先按时间排序,就移到m_from ASC最后

编辑

鉴于您更新的问题,这应该将列限制为您想要的:

SELECT m_from, m_time  FROM `messages` ORDER BY m_from ASC, m_time DESC
于 2013-07-26T15:48:14.347 回答
0

您可以通过执行以下操作获取与最后一条消息相对应的 m_from 以显示在列表顶部:

SELECT m_from, MAX(m_time) AS m_time
FROM messages 
GROUP BY m_from 
ORDER BY m_time DESC

但很难说不知道你想要什么输出......

编辑 :

希望这个可以工作:

SELECT m_user, MAX(m_id) as m_id, MAX(m_time) AS m_time
FROM (
SELECT m_from AS m_user, MAX(m_id) as m_id, MAX(m_time) AS m_time
 FROM messages 
 WHERE m_to = 5
 GROUP BY m_from
UNION
SELECT m_to AS m_user, MAX(m_id) as m_id, MAX(m_time) AS m_time
 FROM messages 
 WHERE m_from = 5
 GROUP BY m_to
 ) AS result
GROUP BY m_user
ORDER BY m_time DESC
于 2013-07-26T16:02:29.857 回答