2016-05-04 13 views
1

Nicht sicher, wie das möglich ist oder ob es eine einfache Lösung ist, von der ich nicht sicher bin, oder sogar den Namen davon.MySQL zufällige Elemente bis zu 10.000 Mal einfügen?

Ich suche 10.000 Zeilen in eine Datenbank mit drei Spalten für einen „Karte“ Bereich von 100x100 einzufügen:

----------------- 
| 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 | 

Grundsätzlich X-Spalte bis zu 100 Y-Spalte geht geht bis zu 100, so wird es sei X: 1 Y: 1 und X: 100 Y: 100 und alle Variationen (10.000) Dazu muss die Typspalte eine Zufallszahl zwischen 1 und 4 sein (das wäre ideal, wenn ich einen Prozentsatz setzen könnte von jeder Zahl z. B. 1 25% der 10.000 2 ist 15%, 3 ist 40% und 4 ist 20%).

Gibt es eine Möglichkeit, dies mit MySQL zu tun, um dies zu generieren, anstatt eine Einfügung für 10.000 Zeilen zu schreiben? Oder wäre es am besten, eine Art PHP-Skript zu schreiben, um es auszuführen und einzufügen?

Danke!

+0

Verwenden Sie ein paar foreach-Schleifen? –

+0

Sie sollten am besten eine Form von PHP-Skript schreiben, um es auszuführen und einzufügen. Versuche es und poste deinen Code, um ihn anzusehen. –

+0

Ich weiß nicht, wie Sie diese Daten genau verwenden, aber dies scheint eine sehr ineffiziente Möglichkeit zu sein, diese Daten zu speichern. Ich würde Ihre Tabellenstruktur so etwas wie "X, Ys" machen und dann würden die Daten gerne "1, 1123442212 ..." haben. Auf diese Weise haben Sie nur 100 Zeilen in Ihrer Datenbank. Wenn Sie ein wenig mehr darüber erklären möchten, wie Sie diese Daten verwenden, können Sie mir gerne vorschlagen, wie Sie Ihre Datenbank über meine ursprünglichen Gedanken hinaus formatieren können. – cmorrissey

Antwort

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; 
+0

fragen Wenn Sie eine 'var_dump ($ Werte); 'Sie können alle Daten anzeigen (+1). –

+0

Dies würde nur * ungefähr * 25% 1s usw. erzeugen. Siehe meine Antwort unten, wenn Sie * genaue * Verteilung wünschen. –

0

Ich würde dies mit einem PHP-Skript lösen.

Zuerst können Sie ein Array von 2500 1s, 1500 2s, 4000 3s und 2000 4s erstellen. Dann benutze zwei foreach-Schleifen (für X und Y) und nimm eine Zahl von einem zufälligen Index im Array und entferne das Element daraus.

Sie möchten Code?

<?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); 
+0

Zeigen Sie den Code ... –

+0

warum Sie es in Mysql –

0

oder dies. du kannst alles mit der nr machen. INSERT INTO newtab .....

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; 
+2

Wow, ich habe keine Ahnung, ob ich das für eine interessante Antwort upvote oder für das "OMG WAS IST DAS!" Seite der Dinge: P. –

+0

Warten Sie, ich lief es nur und ich sehe nur eine Spalte mit Zahlen von 0 bis 500. –

+0

@ Jon Stirling - starten Sie dann sehen Sie die Schleife in MySQL oder MariaDB verwenden, können Sie es in einer Zeile tun SELECT Seq von Seq_1_to_10000; –

Verwandte Themen