2010-06-22 7 views
1

Afin d'avoir une table bien brouillée (pour une expérience psychologique), je voudrais trier chaque colonne de mon tableau par RAND(). Althrough ce code fonctionne:MySQL: appliquer un tri aléatoire sur plusieurs colonnes

SELECT Sort.Variable1, Sort.Variable2 FROM Sort ORDER BY Variable1, Variable2 ASC LIMIT 0 , 30 

remplaçant "ASC" par "RAND()" faire la requête échouer. Quelqu'un peut-il me donner un conseil (même une solution avec PHP)?

Merci

Edit:

Merci à toutes vos réponses, j'ai finalement fait. Voici mon code PHP pour cela (et désolé pour les anciennes requêtes-pas-nouvelles-PDO-requêtes). Même si elle est peut-être inutile, je poste:

  $i=0; 
     //Describe to retrieve variables' names 
     $sqlCol= 'DESCRIBE Sort'; 
     $sqlCol= mysql_query($sqlCol); 
     while ($res=mysql_fetch_array($sqlCol)) { 
      $var[$i]=$res['Field']; 
      $i++; 
     } 
     $NbCol=mysql_num_rows($sqlCol); //Number of column to shuffle 


     // Number of items for each column 
     $sqlCount= 'SELECT COUNT(*) FROM Sort'; 
     $req2= mysql_query($sqlCount) or die ('Err'); 
     $NbLignes= mysql_result($req2,0,0) or die();//Number of rows 


     //Data array 
     $sql= "SELECT * FROM Sort"; 
     $req= mysql_query($sql) or die ('Err'); 
     $sort=mysql_fetch_array($req); 
     for($i=0;$i<$NbCol;$i++) { 
      ${'sql'.$i}='SELECT * FROM Sort ORDER BY RAND()'; 
      ${'input'.$i} = mysql_query(${'sql'.$i}); 
      while(${'array'.$i}=mysql_fetch_array(${'input'.$i})) { 
       $bigArray[$i][]=${'array'.$i}[$i]; 
      } 
     } 

      for($i=0;$i<$NbLignes;$i++) { 
       echo '<div id="q'.$i.'"style="margin-bottom: 50px; float:left">Question '.($i+1); 
       echo '<ul id="sortable'.$i.'" class="sortable">'; 
       for($j=0;$j<$NbCol;$j++) { 
        echo '<li class="ui-state-default" id="'.$var[$j].$i.'" name="'.$var[$j].$i.'">'. $bigArray[$j][$i].'</li>'; 

       } 
       echo '</ul></div>'; 
      } 
+0

Pouvez-vous expliquer pourquoi 'ORDER BY RAND()' ne sera pas faire? –

+0

N'avez-vous pas déjà posé cette question sous une apparence légèrement différente? http: // stackoverflow.com/questions/3075115/mysql-php-order-each-column-of-a-array-randomly – Mike

+0

Je ne vais pas nier que vous êtes vrai; J'ai essayé tous les moyens de le faire avec PHP (while, for, shuffle() ...) depuis 2 jours et j'ai regardé tous les posts sur le sujet mais je ne trouve pas de méthode satisfaisante pour le faire fonctionner . Je suis désolé de poster à nouveau dans un autre shell, mais ce problème me rend vraiment fou et je regarde tous les moyens possibles pour surmonter ce problème. – Coronier

Répondre

0

Voici une méthode possible fais ce que tu veux en utilisant PHP. Dans l'exemple de code, je génère une liste de nombres et les place dans un tableau. Vous devrez récupérer la liste de votre base de données.

<?php 

// Create 20 rows. 
$rows = 20; 

// Create an empty array to hold sorted values. 
$sort = array(); 

// Fill the array with ascending/descending numbers. 
for ($i = 0; $i < $rows; $i++) { 
    $sort[$i]['var1'] = $i + 1; 
    $sort[$i]['var2'] = $rows - $i; 
} 

// Display the sorted array. 
print "Sorted:\n"; 
print_rows($sort); 

// Here's where the important bit happens: 

// Create two arrays, each containing a list of the 
// array keys from the sorted array (one for each column). 
$var1 = array_keys($sort); 
$var2 = array_keys($sort); 

// Shuffle each list or array keys (one for each column). 
shuffle($var1); 
shuffle($var2); 

// Create an empty array to hold shuffled values. 
$shuffle = array(); 

// For every row in the list of shuffled keys, get 
// the matching value from the sorted array, and 
// place it in the shuffled array. 
for ($i = 0; $i < $rows; $i++) { 
    $shuffle[$i]['var1'] = $sort[$var1[$i]]['var1']; 
    $shuffle[$i]['var2'] = $sort[$var2[$i]]['var2']; 
} 

// Display the shuffled array. 
print "\nShuffled:\n"; 
print_rows($shuffle); 


function print_rows($array) { 
    print "Row | Var 1 | Var2\n"; 
    print "------------------\n"; 

    foreach ($array as $key=>$row) { 
     printf("%3d | %5d | %4d\n", $key, $row['var1'], $row['var2']); 
    } 
} 

?> 

est ici la sortie:

Sorted: 
Row | Var 1 | Var2 
------------------ 
    0 |  1 | 20 
    1 |  2 | 19 
    2 |  3 | 18 
    3 |  4 | 17 
    4 |  5 | 16 
    5 |  6 | 15 
    6 |  7 | 14 
    7 |  8 | 13 
    8 |  9 | 12 
    9 | 10 | 11 
10 | 11 | 10 
11 | 12 | 9 
12 | 13 | 8 
13 | 14 | 7 
14 | 15 | 6 
15 | 16 | 5 
16 | 17 | 4 
17 | 18 | 3 
18 | 19 | 2 
19 | 20 | 1 

Shuffled: 
Row | Var 1 | Var2 
------------------ 
    0 |  8 | 2 
    1 | 19 | 12 
    2 | 14 | 5 
    3 | 16 | 17 
    4 |  2 | 8 
    5 | 11 | 4 
    6 |  7 | 11 
    7 |  9 | 10 
    8 | 12 | 1 
    9 |  5 | 9 
10 | 13 | 20 
11 | 10 | 6 
12 | 17 | 19 
13 | 18 | 18 
14 |  4 | 14 
15 | 20 | 7 
16 |  3 | 16 
17 | 15 | 15 
18 |  6 | 3 
19 |  1 | 13 

Le code est un peu rugueux et prêt. Je suis certain qu'il y a plusieurs façons de l'améliorer. Par exemple, vous pouvez le modifier afin qu'il soit capable de gérer un nombre variable de colonnes. Cependant, l'idée de base est là.

Edit:

Voici une tondu version du code, qui traitera un nombre variable de colonnes:

// Here's where the important bit happens: 

// Create an empty array to hold shuffled values. 
$shuffle = array(); 

// Get the name of each column (key) in the array. 
foreach (array_keys($sort[0]) as $col) { 
    // Create an array of keys containing a list of the 
    // array keys from the sorted array. 
    $keys = array_keys($sort); 

    // Shuffle each list or array keys. 
    shuffle($keys); 

    // For every row in the list of shuffled keys, get 
    // the matching value from the sorted array, and 
    // place it in the shuffled array. 
    for ($i = 0; $i < $rows; $i++) { 
     $shuffle[$i][$col] = $sort[$keys[$i]][$col]; 
    } 
} 

// Display the shuffled array. 
print "\nShuffled:\n"; 
print_rows($shuffle); 
+0

C'est tout à fait ce que je cherchais. Je ne peux pas vous remercier assez, je peux maintenant continuer à coder sans mal à la tête. Merci pour votre explication complète et patiente. – Coronier

2

L'utilisation ORDER BY RAND() ne sera pas randomiser colonnes - il randomiser lignes.

randomiser chaque colonne séparément dans SQL, vous pouvez:

  • créer un jeu de résultats pour chaque colonne séparément
  • RANDOMIZE l'ordre de chacun d'eux
  • rejoindre les colonnes par numéro de ligne

Malheureusement, l'équipe de développement de MySQL n'a pas encore implémenté ROW_NUMBER, ce qui aurait facilité cette tâche, mais vous pouvez contourner ce problème en simulant ROW_NUMBER en utilisant des variables:

SELECT 
    Column1, 
    Column2 
FROM 
(
    SELECT Column1, @rn1 := @rn1 + 1 AS rank 
    FROM Table1, (SELECT @rn1 := 0) vars 
) T1 
JOIN 
(
    SELECT Column2, @rn2 := @rn2 + 1 AS rank 
    FROM Table1, (SELECT @rn2 := 0) vars 
    ORDER BY RAND() 
) T2 
ON T1.rank = T2.rank 
+0

Je suis désolé de demander cela, mais si je sais comment rejoindre les tables, je n'ai aucune idée de comment joindre ces résultats ensemble. Pourriez-vous me donner un coup de main s'il vous plaît? – Coronier

+0

Cela entraînerait la commande complète des données et seules les lignes contenant des doublons dans Variable1 et Variable2 seraient randomisées entre elles. Ne semble pas être ce que l'OP cherche ... –

+0

@Joseph Mastey: Le premier bit expliquait simplement l'erreur de syntaxe - j'ai maintenant supprimé cette partie pour éviter toute confusion. Avez-vous vu la deuxième suggestion que j'ai faite dans ma réponse? J'ai maintenant mis à jour ma réponse pour poster le SQL réel requis afin que vous puissiez essayer de l'exécuter par vous-même et laissez-moi savoir si vous pensez que cela ne fonctionne toujours pas. –

0

Vous pouvez faire par 2 statments SQL:

SELECT Sort.Variable1 FROM Sort ORDER BY RAND(), Variable1 LIMIT 0 , 30 
SELECT Sort.Variable2 FROM Sort ORDER BY RAND(), Variable2 LIMIT 0 , 30 

si vous avez besoin au hasard dans l'utilisation du tableau PHP: [array_rand] [1]

<?php 
// load all table values in array i just set them 
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank"); 
$rand_keys = array_rand($input, 2); 
echo $input[$rand_keys[0]] . "\n"; 
echo $input[$rand_keys[1]] . "\n"; 
?> 
Questions connexes