CREATE TABLE message
(`id` int, `from_user_id` text, `to_user_id` text, `created` datetime, `message` text)
;
INSERT INTO message
(`id`, `from_user_id`, `to_user_id`, `created`, `message`)
VALUES
(1, 'a', 'b', '2013-01-14 00:00:00', 'hello'),
(2, 'b', 'a', '2013-01-14 00:00:00', 'world'),
(3, 'b', 'a', '2013-01-15 00:00:00', 'hi!!')
;
我想获取适用于(由发送/接收)用户的最新消息。在上面的示例中,只有2个用户(a,b),并且适用于他们的最后一条消息是id =3。因此,预期结果是
'a', 3, 'b', 'a', '2013-01-15 00:00:00', 'hi!!'
'b', 3, 'b', 'a', '2013-01-15 00:00:00', 'hi!!'
还有在如此相似的问题,我发现最接近的是这里
在最后的答案似乎是我想要的东西,但它是复杂的绕到我的头,也不能使它发挥作用。
我使用lovefield并在浏览器中运行它。它支持sql语法的联接和子集,但可能不高级使用。下面的代码给出了提供的用户ID的最后一条消息,但我希望所有用户都使用行。
SELECT m.*
FROM message m
WHERE 'a' in (from_user_id, to_user_id) AND
m.created = (SELECT MAX(m2.created)
FROM message m2
WHERE (m2.from_user_id = m.from_user_id AND m2.to_user_id = m.to_user_id) OR
(m2.from_user_id = m.to_user_id AND m2.to_user_id = m.from_user_id)
)
ORDER BY m.created DESC
下面的代码给出了提供的用户ID的最后一条消息,但我希望所有用户都使用行。
您的查询看起来不错。只需删除针对特定用户进行过滤的条件,您就应该获得预期的结果:
SELECT m.*
FROM message m
WHERE m.created = (SELECT MAX(m2.created)
FROM message m2
WHERE (m2.from_user_id = m.from_user_id AND m2.to_user_id = m.to_user_id) OR
(m2.from_user_id = m.to_user_id AND m2.to_user_id = m.from_user_id)
)
ORDER BY m.created DESC
这是您的小提琴的更新版本。我为其他用户添加了一些记录,查询返回:
id from_user_id to_user_id created message
4 d c 2013-01-17T00:00:00Z yo!!
3 b a 2013-01-15T00:00:00Z hi!!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句