一个数据库查询返回值的排序问题,请大家来看看!
PostgreSQL数据库
在数据库中查询如下数据(当然这个表中还有其它字段,这里没有使用):
select products_id from products
where products_id in (667,663,691,719,683,675,671,679,687,739)
返回值为:
----------------------------------------------------
667
671
675
679
683
687
691
719
739
663
----------------------------------------------------
为什么得到的结果不按(667,663,691,719,683,675,671,679,687,739)中的顺序排序呢?
而另一个同样的查询得到的结果却是可以按括号中的列表值排序的,例如:
select products_id from products
where products_id in (12,14,13,15,11,436,437,268)
得到的结果如下:
--------------------------------------------------
12
14
13
15
11
436
437
268
-------------------------------------------------
不知道PostgreSQL(或其它的数据库),这种情况下是如何排序的?有什么规律?为什么两次排序的结果不一样?
请各位帮忙!
问题点数:100、回复次数:12Top
1 楼xuzuning(唠叨)回复于 2004-08-02 10:26:39 得分 0
where products_id in (667,663,691,719,683,675,671,679,687,739)
返回的是记录的物理顺序,并不做排序处理Top
2 楼allkill(傲气游)回复于 2004-08-02 11:08:40 得分 0
order by products descTop
3 楼allkill(傲气游)回复于 2004-08-02 11:08:54 得分 2
order by products_id descTop
4 楼feixuehenshui(飞雪恨水)回复于 2004-08-02 11:24:33 得分 2
呵呵 order byTop
5 楼tt007((独孤求败--多情贱客无情贱))回复于 2004-08-02 12:37:07 得分 2
我想用order by楼主一定是知道的,只是不用order by,为什么会这样。。。Top
6 楼pwtitle(doodoo)回复于 2004-08-02 12:44:10 得分 2
只是按默认关键字排序。Top
7 楼hkdsy(花开的声音)回复于 2004-08-02 12:45:56 得分 2
数据库在安装的时候,应该有一种默认的排序方式,可以选择,如果不选择,多半都是默认按照纪录的物理顺序返回了;不用Order by,就不会做其他方式的排序了。Top
8 楼jxyuhua(一塌糊涂)回复于 2004-08-02 13:19:49 得分 0
我是楼主,感谢各位的帮忙。
既然默认的方法不行,那我就想人工自己排序,我想通过这种方法来实现:
一个数组,定义它的排序方式:(pid表示products_id, sid表示排序的值)
$sort = array (
0 => array('pid' => 667, 'sid' => 1),
1 => array('pid' => 663, 'sid' => 2),
2 => array('pid' => 691, 'sid' => 3),
3 => array('pid' => 719, 'sid' => 4))
另一个数组就返回从数据库里查询返回的产品信息:
$products = array(
0 => array('pid' => 667, 'products_name' => 0708),
1 => array('pid' => 691, 'products_name' => 0732),
2 => array('pid' => 719, 'products_name' => 0760),
3 => array('pid' => 663, 'products_name' => 0704))
然后写一个函数,让$products中的内容以'pid'为关键字,按$sort中的内容来排序。
想法是有了,但我还没实现它,不知道大家有什么办法来实现?Top
9 楼skystar008(疯花血月)回复于 2004-08-02 14:09:05 得分 2
order by group byTop
10 楼jxyuhua(一塌糊涂)回复于 2004-08-02 16:22:41 得分 0
我这个是没有固定的徘序字段的,要另外计算出来,就象上面列出的products_id in (12,14,13,15,11,436,437,268)这样,因此order by group by恐怕很难实现。Top
11 楼xuzuning(唠叨)回复于 2004-08-02 17:09:09 得分 88
<?php
$sort = array (
0 => array('pid' => 667, 'sid' => 1),
1 => array('pid' => 663, 'sid' => 2),
2 => array('pid' => 691, 'sid' => 3),
3 => array('pid' => 719, 'sid' => 4));
$products = array(
0 => array('pid' => 667, 'products_name' => '0708'),
1 => array('pid' => 691, 'products_name' => '0732'),
2 => array('pid' => 719, 'products_name' => '0760'),
3 => array('pid' => 663, 'products_name' => '0704'));
// 工作函数用于对$sort数组按sid排序
function _sort($a,$b) {
if($a['sid'] == $b['sid']) return 0;
return $a['sid'] > $b['sid'] ? 1: -1;
}
usort($sort, '_sort'); //对$sort排序,你可任意设定sid列的值
//print_r($sort);
$tmp = array(); //工作数组,用于缓存对$products排序的结果
//工作函数,用于在$products中查找指定元素
function _find($ar, $v) {
foreach($ar as $a)
if($a['pid'] == $v) return $a;
return "";
}
foreach($sort as $v)
$tmp[] = _find($products, $v['pid']);
$products = $tmp;
print_r($products);
?>
Top
12 楼jxyuhua(一塌糊涂)回复于 2004-08-03 09:07:54 得分 0
不多说了,多谢各位,马上结贴。Top




