2009-11-10 3 views
0

Je suppose que ce sera facile pour les pros de MySQL. Étant donné une table MySQL InnoDB existant rempli commeMySQL: Remplir avec des valeurs de position itérées aléatoires

key1 | key2 | foobar | position 

où key1 et key2 ensemble constituent la clé primaire, et la position est la plupart du temps encore NULL, avec ce que SQL serait-je mieux remplir le champ « position » avec un hasard commandé mais itératif valeur entière? Par exemple. s'il y avait 4 lignes, alors je veux avoir (comme un ordre d'exemple):

3 
1 
4 
2 

Contexte: Je veux afficher la table à l'utilisateur dans une application web, et l'ordre doit être statique mais aléatoire, c'est-à-dire une fois décidée aléatoirement mais ensuite avec un ordre prévisible. Parfois, j'ai besoin de réorganiser complètement l'ordre, alors que le reste de la table reste intact. En outre, j'ai parfois besoin d'ajouter quelques lignes à la table avec de nouvelles positions, mais ces nouvelles lignes ne doivent pas être placées plus bas que celles existantes, d'où le besoin d'en faire une itération, et non une utilisation complètement aléatoire. flotte.

Répondre

1

Vous pourriez vouloir essayer quelque chose comme ceci:

CREATE TEMPORARY TABLE IF NOT EXISTS temptable (
    key1 int NOT NULL, 
    key2 int NOT NULL, 
    pos int NOT NULL auto_increment, 
    PRIMARY KEY (key1, key2) 
    ) 
SELECT key1, key2 
FROM yourtable 
ORDER BY RAND(); 

UPDATE yourtable 
SET position = pos 
FROM yourtable INNER JOIN temptable 
       ON yourtable.key1 = temptable.key1 
        AND yourtable.key2 = temptable.key2; 
Questions connexes