【问题标题】:MySQL insert random items up to 10,000 times?MySQL插入随机项最多10,000次?
【发布时间】:2016-05-04 14:47:26
【问题描述】:

不确定这是怎么可能的,或者它是否是一个简单的解决方案,我不确定甚至它的名称。

我希望将 10,000 行插入到数据库中,其中包含 100x100 的“地图”区域的三列:

-----------------
| x | y | type |
-----------------
| 1 | 1 |    1 |
-----------------
| 1 | 2 |    1 |
-----------------
| 1 | 3 |    2 |
-----------------
| 1 | 4 |    3 |
-----------------
| 1 | 5 |    4 |
-----------------
| 1 | 6 |    4 |
-----------------
| 1 | 7 |    2 |
-----------------
| 1 | 8 |    2 |
-----------------
| 1 | 9 |    1 |
-----------------
| 2 | 1 |    2 |
-----------------
| 2 | 2 |    1 |

基本上 X 列上升到 100 Y 列上升到 100 所以会有 X:1 Y:1 和 X:100 Y:100 以及所有的变体 (10,000) 除此之外,类型列需要是一个介于 1 和 4 之间的随机数。(如果我可以设置每个数字的百分比,例如 1 25% 的 10,000 2 是 15%,3 是 40%,4 是 20%,这将是理想的)。

有没有办法用 MySQL 来生成这个而不是为 10,000 行编写插入?还是我最好编写某种形式的 PHP 脚本来执行和插入它?

谢谢!

【问题讨论】:

  • 使用几个 foreach 循环?
  • 您最好编写某种形式的 PHP 脚本来执行和插入它。尝试并发布您的代码以查看它。
  • 我不知道您是如何使用这些数据的,但这似乎是一种非常低效的存储数据的方式。我会让你的表结构类似于X, Ys,然后数据就像1, 1123442212... 这样你的数据库中只有 100 行。如果您想进一步解释一下您是如何使用这些数据的,我很乐意提出超出我最初想法的如何格式化您的数据库。
  • 感谢您的回复。 PHP 可能是我必须采取的路线。 @cmorrissey 我正在制作一张 100x100 方格的基本地图。所以总共有 10,000 个方格,将有 4 种不同的“类型”。
  • @KojoSlayer 我会坚决放弃您当前将每个正方形作为自己的行存储在数据库中的方法...如果您想渲染整个地图,请这样做...您的选择10k 行,这是最低效的方法。

标签: php mysql


【解决方案1】:
<?php
$values = [];

for ($x = 1; $x <= 100; $x++)
{
    for ($y = 1; $y <= 100; $y++)
    {
        $rand = mt_rand(1, 100);

        switch (true)
        {
            case ($rand <= 25):  $i = 1; break;
            case ($rand <= 40):  $i = 2; break;
            case ($rand <= 80):  $i = 3; break;
            case ($rand <= 100): $i = 4; break;
        }

        $values[] = sprintf("(%d, %d, %d)", intval($x), intval($y), intval($i));
    }
}

$sql = "Insert Into table (x, y, type) Values" . implode(',', $values);

echo $sql;

【讨论】:

  • 如果添加var_dump( $values );,则可以显示所有数据(+1)。
  • 这只会产生 大约 25% 1s 等。如果你想要 exact 分布,请参阅下面的答案。
【解决方案2】:

或者这个。你可以用 nr 做任何事情。插入新标签 .....

SELECT a.a*10000 + b.a*1000 + c.a*100 + d.a*10 + e.a AS nr FROM (
 SELECT 0  a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ) AS a
 CROSS JOIN (
 SELECT 0  a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) AS b
 CROSS JOIN (
 SELECT 0  a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) AS c
 CROSS JOIN (
 SELECT 0  a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) AS d
 CROSS JOIN (
 SELECT 0  a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) AS e
ORDER BY nr;

【讨论】:

  • 哇,我不知道我应该赞成这个有趣的答案还是反对“天哪,那是什么!”事情的一面:P.
  • 等等,我刚刚运行它,我只看到一列数字从 0 到 500。
  • @Jon Stirling - 开始,然后你会看到 MySQL 中的循环或使用 MariaDB,你可以在一行中执行 SELECT seq from seq_1_to_10000;
【解决方案3】:

我会用 PHP 脚本解决这个问题。

首先,您可以创建一个包含 2500 个 1、1500 个 2、4000 个 3 和 2000 个 4 的数组。然后使用两个 foreach 循环(用于 X 和 Y)并从数组中的随机索引中获取一个数字,从中删除元素。

你想要代码?

<?php
$values = array_fill(0, 2500, 1)
        + array_fill(2500, 1500, 2)
        + array_fill(4000, 4000, 3)
        + array_fill(8000, 2000, 4);

$statements = [];
foreach (range(1, 100) as $x) {
    foreach (range(1, 100) as $y) {
        $v = $values[mt_rand(0, count($values) - 1)];
        $statements[] = "INSERT INTO table (x, y, type) values ($x, $y, $v);";
    }
}

echo implode("\n", $statements);

【讨论】:

  • 为什么在 mysql 中问它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2011-10-31
  • 2016-08-13
相关资源
最近更新 更多