草庐IT

MySQL - 按父位置和子位置排序

coder 2023-10-22 原文

我有以下查询

SELECT process.*
FROM (`process`)
WHERE `company_id` = '1' AND `status` = '1'                                                        
ORDER BY COALESCE(`process`.`parent_id`, `process`.`id`), `process`.`parent_id` IS NOT NULL asc, `process`.`position` asc

表、数据、查询见SQLFiddie

http://sqlfiddle.com/#!9/d50ba/2

查询根据其位置编号对子流程进行正确排序。 但是,我还需要按位置编号(均为 ASC)排序的主进程。

编辑 订单操作 IDS 应为 7、1、16、41、42、6、40 它应该首先按 ASC 对位置上的所有主进程进行排序,并在每个主进程内对位置 ASC 上的所有子进程进行排序

它是:

╔═════╦════════════╦═════════════╦════════════════╦═══════════════════╦═════════════╦═══════════════╦═══════════╦═════════════╦═══════════╦═════════╦════════════════════════════╗
║ id  ║ parent_id  ║ company_id  ║ department_id  ║       name        ║ user_score  ║ user_comment  ║ ic_score  ║ ic_comment  ║ position  ║ status  ║        date_created        ║
╠═════╬════════════╬═════════════╬════════════════╬═══════════════════╬═════════════╬═══════════════╬═══════════╬═════════════╬═══════════╬═════════╬════════════════════════════╣
║  1  ║ (null)     ║          1  ║             3  ║ Main Process 1    ║          0  ║ (null)        ║        0  ║ (null)      ║        2  ║      1  ║ February, 02 2015 21:04:03 ║
║ 16  ║ 1          ║          1  ║             3  ║ Sub Process 1, 1  ║          0  ║ (null)        ║        0  ║ (null)      ║        1  ║      1  ║ February, 02 2015 21:14:34 ║
║ 41  ║ 1          ║          1  ║             3  ║ Sub Process 4, 1  ║          0  ║ (null)        ║        0  ║ (null)      ║        9  ║      1  ║ February, 09 2015 10:06:40 ║
║  6  ║ (null)     ║          1  ║             3  ║ Main Process 2    ║          0  ║ (null)        ║        0  ║ (null)      ║        8  ║      1  ║ February, 02 2015 21:08:53 ║
║  7  ║ (null)     ║          1  ║             3  ║ Main Process 3    ║          0  ║ (null)        ║        0  ║ (null)      ║        1  ║      1  ║ February, 02 2015 21:09:08 ║
║ 40  ║ (null)     ║          1  ║             3  ║ Main Process 2    ║          0  ║ (null)        ║        0  ║ (null)      ║       16  ║      1  ║ February, 09 2015 10:05:36 ║
║ 42  ║ (null)     ║          1  ║             3  ║ Main Process 3    ║          0  ║ (null)        ║        0  ║ (null)      ║        7  ║      1  ║ February, 09 2015 10:14:36 ║
╚═════╩════════════╩═════════════╩════════════════╩═══════════════════╩═════════════╩═══════════════╩═══════════╩═════════════╩═══════════╩═════════╩════════════════════════════╝

期望的输出:

╔═════╦════════════╦═════════════╦════════════════╦═══════════════════╦═════════════╦═══════════════╦═══════════╦═════════════╦═══════════╦═════════╦════════════════════════════╗
║ id  ║ parent_id  ║ company_id  ║ department_id  ║       name        ║ user_score  ║ user_comment  ║ ic_score  ║ ic_comment  ║ position  ║ status  ║        date_created        ║
╠═════╬════════════╬═════════════╬════════════════╬═══════════════════╬═════════════╬═══════════════╬═══════════╬═════════════╬═══════════╬═════════╬════════════════════════════╣
║  7  ║ (null)     ║          1  ║             3  ║ Main Process 3    ║          0  ║ (null)        ║        0  ║ (null)      ║        1  ║      1  ║ February, 02 2015 21:09:08 ║
║  1  ║ (null)     ║          1  ║             3  ║ Main Process 1    ║          0  ║ (null)        ║        0  ║ (null)      ║        2  ║      1  ║ February, 02 2015 21:04:03 ║
║ 16  ║ 1          ║          1  ║             3  ║ Sub Process 1, 1  ║          0  ║ (null)        ║        0  ║ (null)      ║        1  ║      1  ║ February, 02 2015 21:14:34 ║
║ 41  ║ 1          ║          1  ║             3  ║ Sub Process 4, 1  ║          0  ║ (null)        ║        0  ║ (null)      ║        9  ║      1  ║ February, 09 2015 10:06:40 ║
║ 42  ║ (null)     ║          1  ║             3  ║ Main Process 3    ║          0  ║ (null)        ║        0  ║ (null)      ║        7  ║      1  ║ February, 09 2015 10:14:36 ║
║  6  ║ (null)     ║          1  ║             3  ║ Main Process 2    ║          0  ║ (null)        ║        0  ║ (null)      ║        8  ║      1  ║ February, 02 2015 21:08:53 ║
║ 40  ║ (null)     ║          1  ║             3  ║ Main Process 2    ║          0  ║ (null)        ║        0  ║ (null)      ║       16  ║      1  ║ February, 09 2015 10:05:36 ║
╚═════╩════════════╩═════════════╩════════════════╩═══════════════════╩═════════════╩═══════════════╩═══════════╩═════════════╩═══════════╩═════════╩════════════════════════════╝

最佳答案

这是可能的,但是您需要父进程在子进程行中的位置。为此,您需要自行加入流程表。为了实现所需的排序,我使用了位移位。这将产生一个 BIGINT,其中前 32 位反转用于父位置,后 32 位保留用于子位置。在父行的情况下,它们自己的位置用作前 32 位的位置,后 32 位设置为 0。

这会产生以下查询:

SELECT `process`.*
FROM `process`
LEFT JOIN `process` AS `processParent` ON `processParent`.`id` = `process`.`parent_id`
WHERE `process`.`company_id` = '1' AND `process`.`status` = '1'                                                        
ORDER BY 
    (IF(`process`.`parent_id` IS NULL, `process`.`position`, `processParent`.`position`) << 32)
    + IF(`process`.`parent_id` IS NULL, 0, `process`.`position`) ASC;

编辑:请记住,这仅在进程是父进程或子进程时才有效,但不能同时是两者。

关于MySQL - 按父位置和子位置排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32884835/

有关MySQL - 按父位置和子位置排序的更多相关文章

  1. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  2. ruby - 正则表达式在哪个位置失败? - 2

    我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

  3. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

    我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

  4. ruby-on-rails - 在具有 ActiveRecord 条件的相关模型中按字段排序 - 2

    我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我

  5. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  6. ruby - 下载位置 Selenium-webdriver Cucumber Chrome - 2

    我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1

  7. ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序 - 2

    我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby​​做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排

  8. ruby - Heroku production.log 文件位置 - 2

    我想在heroku.com上查看我的应用程序日志的内容,所以我关注了thisexcellentadvice并拥有我所有的日志内容。但是我现在很想知道我的日志文件实际在哪里,因为“log/production.log”似乎是空的:C:\>herokuconsoleRubyconsoleforajpbrevx.heroku.com>>files=Dir.glob("*")=>["public","tmp","spec","Rakefile","doc","config.ru","app","config","lib","README","Gemfile.lock","vendor","sc

  9. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

  10. ruby - 在 Ruby 中查找多个正则表达式匹配的模式和位置 - 2

    这应该是一个简单的问题,但我找不到任何相关信息。给定一个Ruby中的正则表达式,对于每个匹配项,我需要检索匹配的模式$1、$2,但我还需要匹配位置。我知道=~运算符为我提供了第一个匹配项的位置,而string.scan(/regex/)为我提供了所有匹配模式。如果可能,我需要在同一步骤中获得两个结果。 最佳答案 MatchDatastring.scan(regex)do$1#Patternatfirstposition$2#Patternatsecondposition$~.offset(1)#Startingandendingpo

随机推荐