str:字段名 ,
str1,str2,str3:自定义排序的数值
自然排序: 1,2,3,4,5 , 自定义排序: 5,3,1,4,2
先排 5,3 的数据,1,2,4的数据按照时间来
把 5,3 分 一级, 1,2,4为一级, 每级按时间排序 也可以加一个字段实现下面的效果
如果排序的字段属于字符型的那么就会出现题主提问中的情况,因为数据库引擎是按照对字符串的排序规则实施排序的(从字符串左边第一个字符开始往后逐位比较的,例如“1”<"10,"10"<"2",“10"<"3",..."10"<"9"等)。解办法,可以将该排序字段的数据类型改为数字,如果无法改为数字的话,则可以将字符类型转换为数字类型进行排序。
CREATE TABLE test (`user` varchar(10),
`fruit` varchar(10),
`money` int
)
INSERT INTO test
SELECT 'user1', 'banana', 60 UNION ALL
SELECT 'user1', 'Apple', 1981 UNION ALL
SELECT 'user1', 'watermelon', 4080 UNION ALL
SELECT 'user1', 'Apple', 622 UNION ALL
SELECT 'user2', 'banana', 122246 UNION ALL
SELECT 'user2', 'Apple', 369 UNION ALL
SELECT 'user2', 'watermelon', 57362 UNION ALL
SELECT 'user3', 'banana', 463 UNION ALL
SELECT 'user3', 'watermelon', 11382 UNION ALL
SELECT 'user3', 'Apple', 966
SELECT
CASE
WHEN @user != test.`user` THEN @rownum:= 1
ELSE @rownum:= @rownum + 1
END AS No,
@user := test.`user` AS `User`,
test.`fruit`,
test.`money`
FROM
(SELECT @rownum:=0) r,
(SELECT @user:='') p,
test
ORDER BY
test.`user`,
test.`money` DESC
因为本机 MySQL 编码问题, 就把 中文给 修改成 英文了。
执行结果如下:
mysql> SELECT-> CASE
-> WHEN @user != test.`user` THEN @rownum:= 1
-> ELSE @rownum:= @rownum + 1
-> END AS No,
-> @user := test.`user` AS `User`,
-> test.`fruit`,
-> test.`money`
-> FROM
-> (SELECT @rownum:=0) r,
-> (SELECT @user:='') p,
-> test
-> ORDER BY
-> test.`user`,
-> test.`money` DESC
->
+------+-------+------------+--------+
| No | User | fruit | money |
+------+-------+------------+--------+
| 1 | user1 | watermelon | 4080 |
| 2 | user1 | Apple | 1981 |
| 3 | user1 | Apple | 622 |
| 4 | user1 | banana | 60 |
| 1 | user2 | banana | 122246 |
| 2 | user2 | watermelon | 57362 |
| 3 | user2 | Apple | 369 |
| 1 | user3 | watermelon | 11382 |
| 2 | user3 | Apple | 966 |
| 3 | user3 | banana | 463 |
+------+-------+------------+--------+
10 rows in set (0.00 sec)
mysql>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)