左表是我查询的结果。我需要将其排序为正确的表格。
我需要order by p_id
,如果level >= 2
。右表的蓝色框是 的目标order by
。
是否可以?当然这是一个例子。实际数据有数百个,确实需要排序。
我搜索了很多,但找不到相同的案例。
编辑:此表将返回为java.util.ArrayList
. 如果这种'order by' 是不可能的,它可能在java.util.ArrayList
吗?
左表是我查询的结果。我需要将其排序为正确的表格。
我需要order by p_id
,如果level >= 2
。右表的蓝色框是 的目标order by
。
是否可以?当然这是一个例子。实际数据有数百个,确实需要排序。
我搜索了很多,但找不到相同的案例。
编辑:此表将返回为java.util.ArrayList
. 如果这种'order by' 是不可能的,它可能在java.util.ArrayList
吗?
我确信在 MySQL 中的一个查询中是不可能的。
在右侧的图表中,订购分两个单独的步骤完成:
按编号排序
如果 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 中的一般编程问题并不是一个好的路径。
可以在 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 是否正确,但这个想法可以在单个查询中实现。