2

在此处输入图像描述

左表是我查询的结果。我需要将其排序为正确的表格。

我需要order by p_id,如果level >= 2。右表的蓝色框是 的目标order by

是否可以?当然这是一个例子。实际数据有数百个,确实需要排序。

我搜索了很多,但找不到相同的案例。

编辑:此表将返回为java.util.ArrayList. 如果这种'order by' 是不可能的,它可能在java.util.ArrayList吗?

4

2 回答 2

3

我确信在 MySQL 中的一个查询中是不可能的。

在右侧的图表中,订购分两个单独的步骤完成:

  1. 按编号排序

  2. 如果 level >= 2,则按 p_id 对每个块进行排序

这在 MySQL 中很难做到,因为您需要识别块然后迭代它们,分别对每个块进行排序。

我已经做了类似的事情,需要在块内排序,然后从这些有序块中进行选择。你可以在这里查看,但正如我所说,我认为 SQL 代码非常复杂,涉及 5 个临时表。您可能需要更少的临时表,但这仍然是一个非常复杂的过程,非常缓慢且难以维护。

“实际数据有数百个,确实需要整理。”

有什么理由不能在代码中随意排序吗?

$blockStart = FALSE;
$count = 0;

foreach($dataArray as $data){

   if($blockStart === FALSE){
      $blockStart = $count;
   }

   if($data['level'] < 2){ //Block has finished
       sortBlock($dataArray, $blockStart, $count);
       $blockStart = $count;
   } 

    $count++;
}

sortBlock($dataArray, $blockStart, $count - 1);


function sortBlock($dataArray, $indexStart, $indexEnd){

    //Sort the elements of $dataArray, between $indexStart and $indexEnd inclusive
    //by the value of p_id
}

当你可以在 Java 中用 1/10 的程序员时间解决它(并且可能让它执行得更快)时,试图解决 MySQL 中的一般编程问题并不是一个好的路径。

于 2013-01-10T02:12:42.477 回答
0

可以在 SQL 中执行此操作,但在 MySQL 中这将是一个非常非常复杂的查询。这是方法。

(1) 创建一个子查询,该子查询具有原始 id 和某事物是否处于第 2 级的指示符。此表中的 id 将定义最终订单。

(2) 接下来,为上表中的每个组创建一个单独的计数器。在其他数据库中,您将使用row_number(). 在我的 SQL 中,这需要一个相关的子查询。这提供了从 id 到新排序的映射。

(3) 接下来,为每个组创建一个计数器,但这次使用所需的顺序(根据非 level2 组的 id,根据您的排序规则)。

(4) 将表连接在一起以获得匹配。

(5) 按原id排序。

这是一个尝试:

select altord.*
from (select t.*,
             (select count(*) from t t2 where t2.id <= t.id and ((t2.level = 2 and t1.level = 2) or (t2.level <> 2 and t1.level <> 2))
             ) as seqnum
      from t
     ) ord join
     (select t.*,
             (select count(*) from t t2 where (t2.id <= t.id and t2.level <> 2 and t.level <> 2) or (t2.level = 2 and t.level = 2 and (t2.pid < t.pid or t2.pid = t.pid and t2.id < t.id)))
             ) as seqnum
    ) altord
    on ord.seqnum = altord.seqnum
order by ord.id

我不确定这个 SQL 是否正确,但这个想法可以在单个查询中实现。

于 2013-01-10T03:04:32.750 回答