Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 列出聊天的最后消息_Sql_Sqlite_Lovefield - Fatal编程技术网

Sql 列出聊天的最后消息

Sql 列出聊天的最后消息,sql,sqlite,lovefield,Sql,Sqlite,Lovefield,我想获得适用于用户发送/接收的最后消息。在上面的示例中,只有2个用户a、b,适用于他们的最后一条消息是id=3。因此,预期的结果是 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

我想获得适用于用户发送/接收的最后消息。在上面的示例中,只有2个用户a、b,适用于他们的最后一条消息是id=3。因此,预期的结果是

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!!')
;
所以,我发现的最接近的问题是

这似乎是我想要的,但这是复杂的包裹我的头周围,也无法使其工作

我在浏览器中使用并运行它。它支持sql语法的联接和子集,但可能不支持高级使用。下面的代码给出了提供的用户id的最后一条消息,但我想要所有用户的行

'a', 3, 'b', 'a', '2013-01-15 00:00:00', 'hi!!'
'b', 3, 'b', 'a', '2013-01-15 00:00:00', 'hi!!'
下面的代码给出了提供的用户id的最后一条消息,但我想要所有用户的行

'a', 3, 'b', 'a', '2013-01-15 00:00:00', 'hi!!'
'b', 3, 'b', 'a', '2013-01-15 00:00:00', 'hi!!'
你的问题看起来不错。只需删除筛选特定用户的条件,您就会得到预期的结果:

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
是您的小提琴的更新版本。我为其他用户添加了更多记录,查询返回:

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的最后一条消息,但我想要所有用户的行

'a', 3, 'b', 'a', '2013-01-15 00:00:00', 'hi!!'
'b', 3, 'b', 'a', '2013-01-15 00:00:00', 'hi!!'
你的问题看起来不错。只需删除筛选特定用户的条件,您就会得到预期的结果:

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
是您的小提琴的更新版本。我为其他用户添加了更多记录,查询返回:

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

使用CTE和UNION ALL:

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!!
看。 结果:


使用CTE和UNION ALL:

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!!
看。 结果:

使用UNION:

| user | id  | from_user_id | to_user_id | created             | message |
| ---- | --- | ------------ | ---------- | ------------------- | ------- |
| a    | 3   | b            | a          | 2013-01-15 00:00:00 | hi!!    |
| b    | 3   | b            | a          | 2013-01-15 00:00:00 | hi!!    |
输出 使用UNION:

| user | id  | from_user_id | to_user_id | created             | message |
| ---- | --- | ------------ | ---------- | ------------------- | ------- |
| a    | 3   | b            | a          | 2013-01-15 00:00:00 | hi!!    |
| b    | 3   | b            | a          | 2013-01-15 00:00:00 | hi!!    |
输出
非常感谢。我已经好几年没有直接使用sql了:-干杯代替WHERE m.created=SELECT MAXm2.created,WHERE created在极少数情况下可以有重复项,我们可以使用id吗。比如WHERE m.id=…@bsr:如果有最重要的关系,你想显示哪条消息?这是真的:-是的,虽然没有限制,但我的应用程序中不能有领带。即使如此,对我来说也没关系。再次感谢汉克斯。我已经好几年没有直接使用sql了:-干杯代替WHERE m.created=SELECT MAXm2.created,WHERE created在极少数情况下可以有重复项,我们可以使用id吗。比如WHERE m.id=…@bsr:如果有最重要的关系,你想显示哪条消息?这是真的:-是的,虽然没有限制,但我的应用程序中不能有领带。即使如此,对我来说也没关系。再次感谢感谢您的帮助,并展示了一个更好的sql fiddle应用程序。我不确定这是否能在问题中提到的我的简单sql引擎lovefield中工作。我会试试的。出于好奇,与其他答案相比有任何优势。我认为您希望将该行作为最后一条消息的用户id作为第一列,对吗?是的:-您完全正确。没有思考:-在上搜索分区没有返回任何结果。那么,有没有一种使用常见sql语法的方法呢?感谢您的帮助,并展示了一款更好的sql fiddle应用程序。我不确定这是否能在问题中提到的我的简单sql引擎lovefield中工作。我会试试的。出于好奇,与其他答案相比有任何优势。我认为您希望将该行作为最后一条消息的用户id作为第一列,对吗?是的:-您完全正确。没有思考:-在上搜索分区没有返回任何结果。那么,有没有一种方法可以使用常见的sql语法呢?如果您使用的是另一个数据库,为什么这个标记为sqlite?我在网站上看到了与sqlite的直接比较,并且测试工具是从sqlite移植的。我认为它也是关系数据库中最不常见的分母。如果您使用的是不同的数据库,为什么会将它标记为sqlite?我在网站上看到了与sqlite的直接比较,并且测试工具是从sqlite移植的。我认为它也是关系数据库中最不常见的分母。