使用给定顺序和空随机值对MySQL表进行排序
我有一个MySQL表部分,它有一个列排序。排序的一些值是数字,它们相互排斥(没有两个数字是相同的),而另一些值是简单的NULL 例如:使用给定顺序和空随机值对MySQL表进行排序,mysql,sorting,Mysql,Sorting,我有一个MySQL表部分,它有一个列排序。排序的一些值是数字,它们相互排斥(没有两个数字是相同的),而另一些值是简单的NULL 例如: ID Ordering -- -------- 1 NULL 2 2 3 5 4 NULL 5 NULL 6 3 7 NULL 现在我想对这个表进行排序,并得到以下结果: (ROW NUMBER) ID Ordering ------------ -- -------- ------------ 1 4 NULL 2
ID Ordering
-- --------
1 NULL
2 2
3 5
4 NULL
5 NULL
6 3
7 NULL
现在我想对这个表进行排序,并得到以下结果:
(ROW NUMBER) ID Ordering
------------ -- -------- ------------
1 4 NULL
2 2 2
3 6 3
4 5 NULL
5 3 5
6 7 NULL
7 1 NULL
也就是说,我希望具有非空值的行以给定的顺序出现,但具有空值的行以随机顺序出现在其余的行中(不可预测)
我确信总会有足够的空值来填充空白
我想先得到有顺序的(其中顺序不是空的),然后是没有顺序的(其中顺序是空的),然后创建一个额外的列,将有空的转换成前一列中没有出现的数字
任何帮助都将不胜感激。我在一个项目中使用了它,其中有些部分有固定的位置,但其他部分可以设置为随机顺序。每次加载页面时,都应该随机显示随机部分。您可以使用nvl()函数将空结果更改为0以外的值。我找到了一个解决方案,但它相当笨拙和庞大。我将解释原因:
- 获取一个从1到行数的数字列表(并将其称为all_rows)
- 获取排序不为NULL的节
- 减去这两行,即从所有_行中获取不在现有排序列表中的行,并给它们一个行号。(称之为未使用的行号)
- 获取其排序为空的部分,将它们随机化并给它们一个行号。(使用行号将其称为空)
- 将未使用的_行_编号与空的_行_编号合并,以获得其顺序为空且现在有一个缺少/未使用的行号的所有节
- 最后,把这最后一个和已经有订单和塔塔aa的结合起来
SELECT row_number, id
FROM (
SELECT @curRow2 := @curRow2 + 1 AS row_number2, row_number
FROM (
SELECT @curRow := @curRow + 1 AS row_number
FROM Sections
JOIN (SELECT @curRow := 0) r
) all_rows
JOIN (SELECT @curRow2 := 0) r
WHERE all_rows.row_number NOT IN (
SELECT ordering
FROM Sections
WHERE ordering IS NOT NULL
)) unused_row_numbers,
(
SELECT @curRow3 := @curRow3 + 1 AS row_number3, id
FROM (
SELECT ordering, id
FROM Sections
WHERE ordering IS NULL
ORDER BY RAND()
) randomized_nulls
JOIN (SELECT @curRow3 := 0) r
) nulls_with_row_numbers
WHERE unused_row_numbers.row_number2 = nulls_with_row_numbers.row_number3
UNION
SELECT ordering AS row_number, id
FROM Sections
WHERE ordering IS NOT NULL
ORDER BY row_number
它每次给出不同的结果。示例结果:
ROW_NUMBER ID
---------- --
1 1 (random)
2 2 (always second position)
3 6 (always third position)
4 4 (random)
5 3 (random)
6 5 (always sixth position)
7 7 (random)
但是如何将空值更改为正确的顺序呢?它只能是一个没有出现在“排序”中的数字,并且对于每个空值,它也应该是不同的。最重要的是,它应该是随机的。