SQL逆序查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL逆序查询相关的知识,希望对你有一定的参考价值。

我用的是my-sql数据库,表log一共有3个字段(ID, message, time),表里数据条数未知。现在我想从表的最后一条数据开始向前进行message=123的查询,应该怎么写?
注意:不是输入的时候是逆序的,而是开始查找的时候就从后向前找。
1楼的回答不对哦,这么写还是先从前往后查询,然后逆序输出的。
忘了说,要group by一下,因为会出现message相同的情况。我的表里面还有一个time的字段,记录了数据生成的时间,按一楼的写法,找到的是最早生成的那一条,而不是最晚生成的一条。
2楼确定top是my-sql的关键字吗?我这里无法运行啊。我用的是mysql-front来操作数据库的。
3楼的语句运行的时候出现了“unknown column 'b.time' in 'where clause'”的提示。

参考技术A 以Id排序,降序写,就象楼上的一样``

嘿嘿 top 对ms的有用``对mysql 对应top的是limit

你理解错了吧``我说的mysql中能实现top功能的是limit x,x
参考技术B 想法不对,

select a.* from log a ,(select time = max(time),message from log where message = '123' group by message ) b

where a.time =b.time and a.message = b.message

这样的结果是,最后一个时间上的MESSAGE
改了一下.
select a.* from log a ,(select time = max(time),message from log where message = '123' group by message ) b

where a.time =b.time and a.message = b.message
参考技术C select top * from log where message = '123' order by id desc本回答被提问者和网友采纳 参考技术D select message from log where message = '123' order by id desc

BZOJ3295: [Cqoi2011]动态逆序对

【题意】给定1~n的排列,m次操作每次删除一个数,求每次操作前的逆序对数。n<=10^5,m<=50000。

【算法】CDQ分治+树状数组

【题解】先树状数组求逆序对,然后统计每次删除的逆序对数。

每个数字及其坐标构成一个二维坐标,逆序对就是两个相对位置在左上右下的点,那么删除一个点会减少的逆序对就是其左上偏序和右下偏序中的点数,转化为有操作顺序的二维平面矩阵查询和单点修改,用CDQ分治或树套树解决。

具体细节:

1.先加入所有加点操作(原数字必须作为最开始的操作进入CDQ分治过程),再加入前m-1个删除和询问。

2.第一次统计右下偏序,按x轴逆序排序后CDQ分治。

3.第二次统计左上偏序,令所有点y=n-y+1,然后按x轴正序排序后CDQ分治。

技术分享图片
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&-x)
using namespace std;
int read(){
    char c;int s=0,t=1;
    while(!isdigit(c=getchar()))if(c==-)t=-1;
    do{s=s*10+c-0;}while(isdigit(c=getchar()));
    return s*t;
}
const int maxn=100010;
int n,m,ans[maxn],c[maxn],t[maxn],A[maxn],tot=0;
struct cyc{int id,kind,qid,x,y;}a[maxn*2],b[maxn*2];
long long ANS=0;
void modify(int x,int k){for(int i=x;i<=n;i+=lowbit(i))c[i]+=k;}
int query(int x){int as=0;for(int i=x;i>=1;i-=lowbit(i))as+=c[i];return as;}
bool cmp(cyc a,cyc b){return a.x<b.x||(a.x==b.x&&a.id<b.id);}
bool cmp2(cyc a,cyc b){return a.x>b.x||(a.x==b.x&&a.id<b.id);}
void CDQ(int l,int r){
    if(l==r)return;
    int mid=(l+r)>>1;
    for(int i=l;i<=r;i++){
        if(a[i].id<=mid&&!a[i].kind)modify(a[i].y,a[i].qid?-1:1);
        if(a[i].id>mid&&a[i].kind)ans[a[i].qid]+=query(a[i].y);
    }
    for(int i=l;i<=r;i++)if(a[i].id<=mid&&!a[i].kind)modify(a[i].y,a[i].qid?1:-1);
    int x1=l-1,x2=mid;
    for(int i=l;i<=r;i++)if(a[i].id<=mid)b[++x1]=a[i];else b[++x2]=a[i];
    for(int i=l;i<=r;i++)a[i]=b[i];
    CDQ(l,mid);CDQ(mid+1,r);
}    
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        A[i]=read();
        t[A[i]]=i;
        modify(A[i],1);
        ANS+=i-query(A[i]);
    }
    if(m>1)printf("%lld\n",ANS);
    memset(c,0,sizeof(c));
    for(int i=1;i<=n;i++)a[++tot]=(cyc){tot,0,0,i,A[i]};
    for(int i=1;i<m;i++){
        int x=read();
        a[++tot]=(cyc){tot,0,i,t[x],x};
        a[++tot]=(cyc){tot,1,i,t[x],x};
    }
    sort(a+1,a+tot+1,cmp2);
    CDQ(1,tot);
    for(int i=1;i<=tot;i++)a[i].y=n-a[i].y+1;
    sort(a+1,a+tot+1,cmp);
    CDQ(1,tot);
    for(int i=1;i<m;i++){
        ANS-=ans[i];
        printf("%lld\n",ANS);
    }
    return 0;
}
View Code

 

以上是关于SQL逆序查询的主要内容,如果未能解决你的问题,请参考以下文章

简单分页查询SQL语句

mysql -3练习(分组查询后再次筛选,顺逆序排序)

怎样将数组作为Sql中IN的查询条件

树状数组求逆序数 。,。 蓝桥杯 小朋友排队

P1393 动态逆序对

UVALive - 6910 (离线逆序并查集)