mysql 降序查询,可以创建仅显示降序的mysql查询

为了开始,我想明确表示我不是按降序排序.

我希望通过别的东西来订购,但是只有当第一列中的第1列中的值小于它本身时,才通过在第二列中显示内容来进一步过滤.一旦发现下一列较低,它就会停止.

例:

Ordered by column-------------------Descending Column

353215 20

535325 15

523532 10

666464 30

473460 20

如果给出这些数据,我希望它只返回20,15和10.因为现在30高于10,我们不关心它下面的是什么.

我到处寻找,找不到解决方案.

解决方法:

编辑:删除了大数字init,并在ifnull测试中编辑了计数器,因此它适用于纯MySQL:ifnull(@ prec,counter)而不是ifnull(@ prec,999999).

如果您的起始表是t1且基本请求是:

select id,counter from t1 order by id;

然后使用mysql变量,您可以完成这项工作:

SET @prec=NULL;

select * from (

select id,counter,@prec:= if(

ifnull(@prec,counter)>=counter,

counter,

-1) as prec

from t1 order by id

) t2 where prec<>-1;

除了这里我需要99999作为你的列的最大值,并且可能有一种方法可以在第一个请求的某个地方将@prec初始化为NULL.

这里,prec列包含第一行值计数器,然后是每行的计数器值(如果它小于前一行的计数器值),并且当它变为false时为-1.

更新

如果在WHERE子句中完成变量赋值,则可以完全删除外部选择:

SELECT @prec := NULL;

SELECT

id,

counter

FROM t1

WHERE

(@prec := IF(

IFNULL(@prec, counter) >= counter,

counter,

-1

)) IS NOT NULL

AND @prec <> -1

ORDER BY id;

regilero编辑:

我可以通过这种方式使用1行的临时表(左连接)删除第一个初始化查询:但这可能会减慢查询速度.

(...)

FROM t1

LEFT JOIN (select @prec:=NULL as nullinit limit 1) as tmp1 ON tmp1.nullinit is null

(..)

正如@Mike所说的使用简单的UNION查询甚至:

(...)

FROM t1 , (select @prec:=NULL) tmp1

(...)

如果你想避免第一个查询更好.

所以最后最好的解决方案是:

SELECT NULL AS id, NULL AS counter FROM dual WHERE (@prec := NULL)

UNION

SELECT id, counter

FROM t1

WHERE (

@prec := IF(

IFNULL(@prec, counter) >= counter,

counter,

-1 )) IS NOT NULL

AND @prec <> -1

ORDER BY id;

+--------+---------+

| id | counter |

+--------+---------+

| 353215 | 20 |

| 523532 | 10 |

| 535325 | 15 |

+--------+---------+

+----+--------------+------------+------+---------------+------+---------+------+------+------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+--------------+------------+------+---------------+------+---------+------+------+------------------+

| 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE |

| 2 | UNION | t1 | ALL | NULL | NULL | NULL | NULL | 6 | Using where |

| NULL | UNION RESULT | | ALL | NULL | NULL | NULL | NULL | NULL | Using filesort |

+----+--------------+------------+------+---------------+------+---------+------+------+------------------+

标签:mysql,sorting,sql-order-by

来源: https://codeday.me/bug/20190530/1186541.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值