修改
解决了!这是我的错,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>";
}
但是你会看到你是否测试过它,排序只会影响AGE ...
我不知道我做错了什么,请告诉我们T_T
答案 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岁的亚当和贝丝,贝丝会按照“按年龄,名字排序”来追随亚当。