Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用给定顺序和空随机值对MySQL表进行排序_Mysql_Sorting - Fatal编程技术网

使用给定顺序和空随机值对MySQL表进行排序

使用给定顺序和空随机值对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

我有一个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            2   2
3            6   3
4            5   NULL
5            3   5
6            7   NULL
7            1   NULL
也就是说,我希望具有非空值的行以给定的顺序出现,但具有空值的行以随机顺序出现在其余的行中(不可预测)

我确信总会有足够的空值来填充空白

我想先得到有顺序的(其中顺序不是空的),然后是没有顺序的(其中顺序是空的),然后创建一个额外的列,将有空的转换成前一列中没有出现的数字


任何帮助都将不胜感激。我在一个项目中使用了它,其中有些部分有固定的位置,但其他部分可以设置为随机顺序。每次加载页面时,都应该随机显示随机部分。

您可以使用nvl()函数将空结果更改为0以外的值。

我找到了一个解决方案,但它相当笨拙和庞大。我将解释原因:

  • 获取一个从1到行数的数字列表(并将其称为all_rows
  • 获取排序不为NULL的节
  • 减去这两行,即从所有_行中获取不在现有排序列表中的行,并给它们一个行号。(称之为未使用的行号)
  • 获取其排序为空的部分,将它们随机化并给它们一个行号。(使用行号将其称为空)
  • 将未使用的_行_编号与空的_行_编号合并,以获得其顺序为空且现在有一个缺少/未使用的行号的所有节
  • 最后,把这最后一个和已经有订单和塔塔aa的结合起来
下面是SQL:

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)

但是如何将空值更改为正确的顺序呢?它只能是一个没有出现在“排序”中的数字,并且对于每个空值,它也应该是不同的。最重要的是,它应该是随机的。