我认为从2个表进行查询: 消息表和消息状态表。 每条消息都有几种状态。
该视图的目的是为每条消息计算其首尾状态:
//Body Parser middleware
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
//Use routes
app.use('/message', message);
我在(message_id ,date)在状态表中。 该查询花了我8秒钟的时间-我想改善它。
您有什么想法吗?我当时在考虑使用物化视图-但是我在使用它时遇到了麻烦(做刷新使我永远生了)-我应该知道任何最佳实践吗?甚至推荐吗?
非常感谢,
编辑: 例如,
消息包含:
#include<stdio.h>
int main()
{
int i,j=0;
char str[50];
printf("Donnez une chaine: ");
gets(str);
for(i=0;str[i]!='\0';++i)
{
if(str[i]!=' ')
str[j++]=str[i];
}
str[j]='\0';
printf("\nSans Espace: %s",str);
return 0;
}
message_status包含:
with last_msg_status as (
select distinct on (message_id) message_id,date,type
from message_status
order by message_id,date desc
), first_msg_status as (
select distinct on (message_id) message_id,date,type
from message_status
order by message_id,date
)
select *
from messages m
join last_msg_status ls on ls.message_id = m.id
join first_msg_status fs on fs.message_id = m.id;
结果应为:
{ {2}}答案 0 :(得分:0)
如果您希望每条消息的第一个和最后一个状态,我建议从正确的表开始,看看相关的子查询是否起作用:
select m.*,
(select ms.status
from mesasge_status ms
where ms.message_id = m.id
order by ms.date asc
limit 1
) as first_status,
(select ms.status
from mesasge_status ms
where ms.message_id = m.id
order by ms.date desc
limit 1
) as last_status
from messages m;
这至少应该更接近完成您想要的目标。如果message_status
在(message_id, date)
上有一个索引,那么这可能满足您的性能目标。
编辑:
如果要使用多个列,则可以使用元组-或更实际地,可以使用横向联接:
select m.*, ms_first.*, ms_last.*
from messages m cross join lateral
(select . . .
from mesasge_status ms
where ms.message_id = m.id
order by ms.date asc
limit 1
) ms_first cross join lateral
(select . . .
from mesasge_status ms
where ms.message_id = m.id
order by ms.date desc
limit 1
) ms_last;