我有表message
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`from_user_id` int(10) unsigned NOT NULL
`to_user_id` int(10) unsigned NOT NULL,
`request_id` int(10) unsigned DEFAULT NULL,
`text` varchar(1000) NOT NULL,
`date` datetime DEFAULT NULL,
内部数据:
1 4 1 3 Text1 01.05.2014 14:02
2 4 1 3 Text2 02.05.2014 14:02
3 4 1 3 Text3 03.05.2014 14:02
4 4 1 4 Text4 04.05.2014 14:02
5 4 1 4 Text5 05.05.2014 14:02
6 2 1 3 Text6 06.05.2014 14:02
7 2 1 3 Text7 07.05.2014 14:02
例如,第一行代表以下内容: 用户4发送了消息' Text1'关于01.05.2014 14:02的请求3给用户1。
我想向用户1收到针对不同请求的所有最新消息。 我期望获得的结果是:
3 4 1 3 Text3 03.05.2014 14:02
5 4 1 4 Text5 05.05.2014 14:02
7 2 1 3 Text7 07.05.2014 14:02
我已经尝试过了:
SELECT * FROM `message` `t`
WHERE `to_user_id`='1' AND
`date` =
(SELECT MAX(`date`) FROM
(SELECT * FROM `message` `t3`
WHERE `t3`.`request_id`=`t`.`request_id`
) `t2`
WHERE `t2`.`from_user_id`=`t`.`from_user_id`
);
但它返回了错误#1054 - Unknown column 't.request_id' in 'where clause'
似乎无法从t
子句内找到别名WHERE
。
有什么建议吗?
编辑:
该表由offer_id和request_id组成。其中只有一个可以为NULL。感谢@ fancyPants'回答我找到了正确的解决方案
SELECT * FROM `message` `t`
WHERE `to_user_id`='1' AND
`date` =
(SELECT MAX(`date`) FROM `message` `t2`
WHERE `t2`.`from_user_id`=`t`.`from_user_id`
AND (`t2`.`request_id`=`t`.`request_id` OR
`t2`.`offer_id`=`t`.`offer_id`)
);
答案 0 :(得分:1)
嗯,你过度复杂了。试试这个:
SELECT * FROM `message` `t`
WHERE `to_user_id`='1' AND
`date` =
(SELECT MAX(`date`) FROM `message` `t2`
WHERE `t2`.`from_user_id`=`t`.`from_user_id`
AND `t2`.`request_id`=`t`.`request_id`
);
此处描述了其他方法:The Rows Holding the Group-wise Maximum of a Certain Column
答案 1 :(得分:0)
你是对的,可能不会那么深。我也有这个问题,还有另一个dbms。
至于重写查询:您通常会编写一个查询来获取最大日期,然后加入消息表:
select m.*
from
(
select to_user_id, request_id, max(`date`) as `date`
from message
where to_user_id = 1
group by to_user_id, request_id
) last_m
inner join message m
on m.to_user_id = last_m.to_user_id
and m.request_id = last_m.request_id
and m.date = last_m.date;
我在 date 上使用了特殊引号,在没有限定符的情况下使用它,因为它是一个保留字。