0

编辑

解决了 !这是我的错,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 name, age) 或 AGE ( ORDER BY age, name;

当我感到沮丧时,我决定只获取该查询并在 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>";
}

但是你会看到如果你测试这个,排序只会影响年龄......

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

4

2 回答 2

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
于 2012-11-28T12:49:09.353 回答
0

如果我对您的理解正确,您要做的就是仅按名称的第一个字母排序,然后按年龄排序。- 你从 mysql 得到的正是我对你的查询和数据集的期望。如果您选择多列进行排序,则仅当您在第一列中具有相同的值时,第二列才会起作用,例如,如果您有两个 Adam,一个 18 岁,一个 20 岁,则这两个将按年龄排序。如果你有亚当和贝丝,都是 18 岁,贝丝会在“按年龄、姓名排序”中排在亚当之后

于 2012-11-28T12:51:23.547 回答