php或/和mysql中的多重排序不会生效

时间:2012-11-28 12:45:26

标签: php mysql arrays sorting multidimensional-array

修改

解决了!这是我的错,mysql查询和php方法,两者都很完美。我非常糟糕的例子就是为自己辩护。他们应该按照收藏(真/假)然后按日期对产品进行分类。


我正在尝试用两个“cols”对多维数组进行排序,但它对我不起作用:O

我已经编写并复制了所有可能的方法(mysql - order by,php - array_multisort()) 但它仍然不适合我......

这是我首先尝试的方法:

// MySQL Query
SELECT * FROM `test` ORDER BY `name` ASC, `age` DESC;
// or
SELECT * FROM `test` ORDER BY `name`, `age`;
// or
SELECT * FROM `test` ORDER BY name, age;
// or
SELECT * FROM `test` ORDER BY name, age DECT;

// `name` is VARCHAR and `age` is INT

所以,我尝试了所有可能的语法,但查询不会给我想要的结果。

原始表:

ID    NAME     AGE
---------------------
1     adam     23
2     bernd    30
3     cris     22
4     dora     21
5     anton    18
6     brad     36
7     sam      41
8     ali      13

我想从MySQP查询中得到什么:

ID    NAME     AGE
---------------------  // first sort by name...
8     ali      13      // then sort by age
5     anton    18      // ...
1     adam     23      // for each "similar" name or names with "a", "b", ...
2     bernd    30      // and so on...
6     brad     36
3     cris     22
4     dora     21
7     sam      41

但它实际上是按照NAME(ORDER BY nameage)或AGE(ORDER BY agename排序;

因为我感到沮丧,我决定只是获取该查询并在PHP中对其进行排序......

好吧,我也试过一些代码,但它们都不起作用。

这是我现在做的那个:

// this array is just exported from mysql to debug without mysql query...
$test = array(
  array('id' => '1','name' => 'adam','age' => '23'),
  array('id' => '2','name' => 'bernd','age' => '30'),
  array('id' => '3','name' => 'cris','age' => '22'),
  array('id' => '4','name' => 'dora','age' => '21'),
  array('id' => '5','name' => 'anton','age' => '18'),
  array('id' => '6','name' => 'brad','age' => '36'),
  array('id' => '7','name' => 'sam','age' => '50'),
  array('id' => '8','name' => 'ali','age' => '13')
);

// ...print out the original array
foreach( $test as $key => $value ) {
    echo $value['name'] . " - " . $value['age'] . "<br>";
}

// here is the part where i am sorting...
$sort = array();
foreach ($test as $key => $value ) {
    $sort['name'][$key] = $value['name'];
    $sort['age'][$key] = $value['age'];
}

array_multisort($sort['age'], SORT_ASC, $sort['name'], SORT_DESC, $test);
// ...till here.

// reorder array and print the new sorted array
$sorted = array();
for( $i = 0; $i < count( $sort['name'] ); $i++ ) {
    array_push( $sorted, array( $sort['name'][$i], $sort['age'][$i] ) );
    echo $sort['name'][$i] . " - " . $sort['age'][$i] . "<br>";
}

但是你会看到你是否测试过它,排序只会影响AGE ...

我不知道我做错了什么,请告诉我们T_T

2 个答案:

答案 0 :(得分:2)

在我看来,您只想对名称的第一个字符进行排序:

你应该尝试:

SELECT * FROM `test` ORDER BY SUBSTR(name,0,1), age;

您遇到的绝对是预期的行为。为什么?如果您先按name排序,则会在名称列中为完整字符串排序结果,其中

'adam' < 'ali' < 'anton'

如果有多个行name='adam',但年龄不同,请执行以下操作:

ID    NAME     AGE
---------------------
1     adam     23
5     anton    18
8     ali      13
9     adam     52

你会得到SELECT * FROM test ORDER BY name, age;

的结果
ID    NAME     AGE
---------------------
1     adam     23
9     adam     52
8     ali      13
5     anton    18

首先按name列排序,其中两个adam值相同,然后根据年龄进行排序,其中23小于52 ...

但现在,对名字的第一个字符和年龄SELECT * FROM test ORDER BY SUBSTR(name,0,1), age;进行排序:

ID    NAME     AGE
---------------------
8     ali      13
5     anton    18
1     adam     23
9     adam     52

答案 1 :(得分:0)

如果我正确地告诉你,你想要做的就是在名字的第一个字母上排序,然后在年龄上排序。 - 你从mysql得到的正是我对你的查询和数据集的期望。如果您选择多个列进行排序,只有在第一个列中具有相同的值时才会启动,例如,如果您有两个Adams,一个18和一个20岁,则两个将按年龄排序。如果你有18岁的亚当和贝丝,贝丝会按照“按年龄,名字排序”来追随亚当。