3

我正在创建 Web 服务以返回聊天和通知列表。用户可以输入页码和每页显示的项目数,但可以返回 2 种类型的对象(从最新到最新),并且必须显示在同一个列表中。

我有两张桌子chatnotification

CREATE TABLE chat
(
  idchat serial NOT NULL,
  idinterest integer NOT NULL,
  idowner integer NOT NULL,
  iduser integer NOT NULL,
  creationdate,
  editdate,
  CONSTRAINT pk_chat PRIMARY KEY (idchat)
)

CREATE TABLE notification
(
  idnotification serial NOT NULL,
  message character varying(255) NOT NULL,
  creationdate date NOT NULL,
  datefinvalidite date NOT NULL,
  idcompte integer NOT NULL,
  idtypenotification integer NOT NULL,
  sender integer NOT NULL DEFAULT 0,
  CONSTRAINT pk_notification PRIMARY KEY (idnotification)
)

我想创建一个视图,将所有聊天和通知分组,由一个 id(idchatidnotification)、一个日期(creationdate)和一个布尔值组成ischat

但我不知道这是否是正确的解决方案。

问题 如果我必须返回 20 行有序消息(通知和聊天),我可以:

  • 收到 10 个最后通知,然后是 10 个最后聊天,但第 9 个聊天可能比第 11 个通知更早

  • 检查最新聊天的日期,如果第 20 条最新通知较旧,则仅获取通知,否则...我不知道

  • 获取 20 条最新通知,20 条最新聊天订购它们并将它们发送给客户端,但对于同时处理许多请求的服务器来说,这可能是一项繁重的任务。

4

1 回答 1

1
select idchat id, creationdate, true ischat
from chat

union all

select idnotification id, creationdate, false ischat
from notification

order by creationdate desc limit 20

这个版本可能会更快:

select *
from
    (
        (
            select idchat id, creationdate, true ischat
            from chat
            order by creationdate desc
            limit 20
        ) 

        union all

        (
            select idnotification id, creationdate, false ischat
            from notification
            order by creationdate desc
            limit 20
        ) 
    ) s

order by creationdate desc limit 20
于 2013-05-14T16:10:13.243 回答