php mysql 双条件排序_php 一次查询 按多条件排序

你的位置:

问答吧

-> 数据库

-> 问题详情

php 一次查询 按多条件排序

各位兄弟又有问题要请教大家了。

我最近作一个项目 要实现的效果是 查询 一张表,取出全部符合的结果,然后按照多条件排序

要求效果:

1. select * form 表 where 时间 between now~3天前  and 推荐属性=1 order by 日期倒序,价格从大到小

2. select * form 表 where 时间 between now~3天前  and 推荐属性=0 order by 日期倒序,价格从大到小

3. select * form 表 where 时间 = 3天以前  order by 日期倒序,推荐1在前0在后,价格从大到小

希望能把三种查询合并成1次查询完成

因为多次查询的话分页有难度,而且我又不希望1次查出全部,然后分页,我的数据有几百万条,这样会很慢

请问有什么好的解决办法?感觉很有难度阿

作者: xiaolabi

发布时间: 2007-07-09

用union行不?

(select * form 表 where 时间 between now~3天前  and 推荐属性=1 order by 日期倒序,价格从大到小) union(select * form 表 where 时间 between now~3天前  and 推荐属性=0 order by 日期倒序,价格从大到小

)union(select * form 表 where 时间 = 3天以前  order by 日期倒序,推荐1在前0在后,价格从大到小)

作者: yaba

发布时间: 2007-07-09

我试了 union 中的排序没反应

(SELECT a FROM table_name WHERE a=10 AND B=1 order by a desc)

UNION

(SELECT a FROM table_name WHERE a=11 AND B=2 order by a desc);

显示结果 a 的升序

作者: xiaolabi

发布时间: 2007-07-09

(SELECT a FROM table_name WHERE a=10 AND B=1)

UNION

(SELECT a FROM table_name WHERE a=11 AND B=2)

order by a desc;

这样写的排序才有用,但是这样就打乱了2个记录集的排列(两个集中的数据相互交叉了)

作者: xiaolabi

发布时间: 2007-07-09

期待看到答案,我也有这个需要

作者: yxljames

发布时间: 2007-07-09

这个问题貌似很难,问了十几个论坛都无法解决!

作者: xiaolabi

发布时间: 2007-07-10

一种解决方法

SELECT * FROM (select * form 表 where 时间 between now~3天前  and 推荐属性=1 order by 日期倒序,价格从大到小) union all

SELECT * FROM (select * form 表 where 时间 between now~3天前  and 推荐属性=0 order by 日期倒序,价格从大到小

)union all

SELECT * FROM (select * form 表 where 时间 = 3天以前  order by 日期倒序,推荐1在前0在后,价格从大到小)

注,上面的方法在ORACLE中测试通过,但是在ACCESS中测试无法通过

因为对于如下的数据

表 TESTTB

A     B

--------------

1     0

3     0

2     1

4     1

执行SELECT * FROM TESTDB

在ORACLE中执行检索得到如下记录

A     B

--------------

1     0

3     0

2     1

4     1

而在ACCESS中执行检索得到如下记录

A     B

--------------

1     0

2     1

3     0

4     1

也就是说ACCESS中在没有排序条件的情况下,似乎默认根据第一个字段进行排序。

这个导致上面的方法在ACCESS中不行。

根据你的数据库来看执行结果以确定这个方法是否可行。

[ 本帖最后由 SinNeR 于 2007-7-10 16:46 编辑 ]

作者: SinNeR

发布时间: 2007-07-10

另一个解决方法,要看你第3个数据的排序条件来定

select * form 表 where 时间 = 3天以前  order by 日期倒序,推荐1在前0在后,价格从大到小

如果按照现在的排序条件不可行。

如果是

select * form 表 where 时间 = 3天以前  order by 推荐1在前0在后,日期倒序,价格从大到小

也就是说推荐字段的排序要比日期优先的话,可以这样做。

检索的时候添加一个字段MSORT。

复制内容到剪贴板

代码:(select [所有的字段],1 MSORT form 表 where 时间 between now~3天前) union all

(select [所有的字段],0 MSORT form 表 where 时间 = 3天以前  )通过添加的1个字段,人工的将3天前的数据和3天后的数据分开了。

上面的SQL还可以再度简化。

复制内容到剪贴板

代码:select [所有的字段],decode(时间 between now~3天前,1,0) MSORT form 表  order by MSOR DESC,推荐1在前0在后,日期倒序,价格从大到小decode(时间 between now~3天前,1,0)

decode是oracle中的函数,如下decode(a1,v1,a2,v2,...,v0)

意思是如果a1条件成立,取得v1的值,如果a2的条件成立,取得v2的值,默认取v0

这里就是如果时间 between now~3天前,取得1,否则,取得0。

相信你的数据库中也有类似的函数。

-------------------------------------------

以上是想到的解决方法,至于效率方面,几百万条数据。。。。。。一下子检索出来肯定不是办法。建index之类的,对效率会有一定的影响,但是还不是本质解决问题的方法。应该从只检索需要的数据这个角度来考虑问题。

作者: SinNeR

发布时间: 2007-07-10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值