更新的问题:
这是数据
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,第四个是m_time
现在我想要的是,我想通过m_from分组并按m_time排序。将添加的新消息应该在顶部,下一行应该在第二行......等等。
我用过。
SELECT m_from,m_time FROM messages WHERE m_to='5' GROUP BY m_from ORDER BY m_time DESC
但正在以这样的方式重新开始
444
1
5
所以,它没有正确排序数据..
答案 0 :(得分:0)
这似乎是来自SELECT *
和GROUP BY
的问题。 MySQL允许这种情况发生,但它可能会导致一些问题。
MySQL扩展了GROUP BY的使用,因此选择列表可以引用GROUP BY子句中未命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。 服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。此外,添加ORDER BY子句不会影响每个组中值的选择。选择值后会对结果集进行排序,而ORDER BY不会影响服务器选择的每个组中的值。
至于获取您想要的数据,我认为this对您有用:
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
答案 1 :(得分: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;
答案 2 :(得分: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