为了开始,我想明确表示我不是按降序排序.
我希望通过别的东西来订购,但是只有当第一列中的第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