你的位置:
问答吧
-> 数据库
-> 问题详情
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