草庐IT

mysql - 可以创建一个只显示降序的 mysql 查询

coder 2023-10-09 原文

首先,我想说明一下,我并不是要按降序排列。

我希望通过其他方式进行排序,但仅当其下方第 1 行中的值小于其本身时,才通过在第二列中显示内容来进一步过滤。一旦它发现下一列较低,它就会停止。

例子:

Ordered by column-------------------Descending Column
353215                                    20
535325                                    15
523532                                    10
666464                                    30
473460                                    20

如果给出该数据,我希望它只返回 20、15 和 10。因为现在 30 高于 10,我们不关心它下面的内容。

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

最佳答案

编辑:删除了大数初始化,并在 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 列包含第 1 行值计数器,然后是每行的计数器值,如果它小于上一行的值,当它变为 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 |
+--------+---------+

EXPLAIN SELECT输出:

+----+--------------+------------+------+---------------+------+---------+------+------+------------------+
| 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 | <union1,2> | ALL  | NULL          | NULL | NULL    | NULL | NULL | Using filesort   | 
+----+--------------+------------+------+---------------+------+---------+------+------+------------------+

关于mysql - 可以创建一个只显示降序的 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6796708/

有关mysql - 可以创建一个只显示降序的 mysql 查询的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  5. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  6. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  7. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  8. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  9. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  10. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

随机推荐