表格:
(`post_id`, `forum_id`, `topic_id`, `post_time`)
(79, 8, 4, '2012-11-19 06:58:08');
(80, 3, 3, '2012-11-19 06:58:42'),
(81, 9, 9, '2012-11-19 06:59:04'),
(82, 11, 6, '2012-11-19 16:05:39'),
(83, 9, 9, '2012-11-19 16:07:46'),
(84, 9, 11, '2012-11-19 16:09:33'),
查询:
SELECT post_id, forum_id, topic_id FROM posts
GROUP BY topic_id
ORDER BY post_time DESC
LIMIT 5
结果是:
[0] => [post_id] => 84 [forum_id] => 9 [topic_id] => 11
[1] => [post_id] => 82 [forum_id] => 11 [topic_id] => 6
[2] => [post_id] => 81 [forum_id] => 9 [topic_id] => 9
[3] => [post_id] => 80 [forum_id] => 3 [topic_id] => 3
[4] => [post_id] => 79 [forum_id] => 8 [topic_id] => 4
问题是:
如何重写查询,使其返回post\u id->83而不是post\u id->81?
它们都有相同的论坛和主题id,但是post\u id->81的日期比post\u id->83的日期早。
但似乎groupby得到的是“第一”张唱片,而不是“最新”的。
我试着把查询改成
SELECT post_id, forum_id, topic_id, MAX(post_time)
但它同时返回81号和83号邮政编码
5条答案
按热度按时间dw1jzc5e1#
也许这不是最好的方法,但有时函数组\u concat()可以是userfull,它将返回一个字符串,其中包含所有聚合值,按需要排序,并用逗号分隔(耦合值用空格分隔)。然后我使用函数split\u string()来剪切字符串中的第一个id。
所以聚合的论坛id,发布时间如下:
81 2012-11-19 06:59:04,83 2012-11-19 16:07:46
因此,您需要使用整数和日期时间对的字符串表示,每个对用逗号分隔,因此我使用此函数来获取第一个int:
注意:函数split\u string(str,delim,pos)在这里找到:相当于explode()在mysql中处理字符串
y4ekin9u2#
它不是很漂亮,但很管用:
o75abkj43#
如果选择group子句中未使用且不是聚合的属性,则结果未指定。i、 e您不知道从哪些行中选择其他属性(sql标准不允许这样的查询,但mysql更为宽松)。
然后应将查询写入,例如
或者
ki0zmccv4#
这对你也很有用。
tktrz96b5#
试试这样的
更改
order by
以及limit
根据需要。