mysql 按某一条件自动排序问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 按某一条件自动排序问题相关的知识,希望对你有一定的参考价值。

user 水果 费用
user1 香蕉 60
user1 苹果 1981
user1 西瓜 4080
user1 苹果 622
user2 香蕉 122246
user2 苹果 369
user2 西瓜 57362
user3 香蕉 463
user3 西瓜 11382
user3 苹果 966
我现在用了一个函数来解决这个问题,语句如下:
SELECT
*,@rownum :=@rownum + 1 AS rownum,

IF (
@pa = ff.user ,@number :=@number + 1 ,@number := 1
) AS number ,@pa := ff.user
FROM test ff,
(
SELECT
@number := 0 ,@rownum := 0 ,@pa = NULL
) tt
功能是可以实现 ,但有一个问题,就是按user的不同用户来排序时,第一次使用时总是给排成全是1 的,这个就不是我想要的结果了。错误 时如下图所示

只有在语句上做一下改动后才能出现正确排序的结果。这个问题困扰我很久了,不知道怎么可以避免这个问题,一次就能出现我要的结果。正确时如下:

请求指点解决,多谢多谢!

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>

参考技术A 后面加上order by user,number;追问

不行,第一次执行number还是全是1,你说的我知道是要按费用和用序排个序,这都没问题,现在的问题我第一次执行这个脚 本时,就会出现number全是1的问题,必须在语句上有操作行为后再挂执行语句,才是正确的

追答

要么就在建表,用关联的方式实现

追问

您说的这个建表,关联实现方式 ,是怎么能把这个排序的问题解决?因为上面的数据只是一个样表,真实数据要上千万行。

ASP+ACCESS里怎样按某条字段值自定义排序?

如有条字段类型是数值型,该数据表内记录共有N条,在ASP程序的网页里依次列出所有记录,当点击链接“置前”时,那么该条记录自动排到第一,其他的依次往下排
这些应该都是读取数据出来后再排序,我的意思可能没有表述清楚,是这样:
读取数据输出是ORDER BY 需要排序的字段
现在要做的是将输出后的数据中的某一条记录(该条记录可能会在所有记录中的任何位置)调整到第一位置,也就是:
原始输出:
编号 姓名 排序
1 张三 [置前]
2 李四 [置前]
3 王五 [置前]
其中[置前]是一链接,好了,当我点击“王五”旁边的[置前]时,链接到另一页面,而另一页面就会修改数据库记录的排列顺序,从来再输出时得到:
编号 姓名 排序
3 王五 [置前]
1 张三 [置前]
2 李四 [置前]

这是排序问题
用SQL来做
sql="select * from 表名 where id<>0 Order By 字段名 desc

你改一下他们的编号,不就可以了,ASP更新数据的问题
参考技术A 加个字段做标志位

以上是关于mysql 按某一条件自动排序问题的主要内容,如果未能解决你的问题,请参考以下文章

js表格按某一列排序

怎样使excel表格内容按某一列排序

access 按某一字段的几个字符排序

ASP+ACCESS里怎样按某条字段值自定义排序?

mysql按照时间排序去重查询?

mysql 对符合条件的字段进行排序