2010-04-20 3 views
1

Je me demande s'il existe un moyen intelligent de renvoyer un ensemble de données "mixtes/équilibrées" selon un critère spécifique? Pour illustrer, disons qu'il existe des résultats potentiels dans une table qui peut être de type 1 ou de type 2 (c'est-à-dire qu'une colonne a une valeur de 1 ou 2 pour chaque enregistrement). Y at-il une question intelligente qui serait en mesure de revenir directement des résultats en alternance entre 1 et 2 dans l'ordre:MySQL: Est-il possible de retourner un ensemble de données "mixtes"?

1er enregistrement est de type 1, 2ème disque est de type 2, 3ème enregistrement est de type 1, 4 enregistrement est de type 2, etc ...

Excuses si la question est stupide, il suffit de chercher quelques options. Bien sûr, je pourrais retourner n'importe quelles données et le faire en PHP, mais cela ajoute du code.

Merci.

+0

Vous avez donc une table avec une colonne 'x' qui contient soit' 1' ou '2', et vous voulez que votre résultat renvoie des lignes avec des valeurs alternées de' x', est-ce que je comprends bien? D'autres critères de tri? Que se passe-t-il si le nombre de '1'-rows n'est pas le même que le nombre de' 2'-rows? –

+0

@ Peter-Lang: Oui, c'est vrai. Aucun autre critère de tri mais une clause WHERE certainement. Si le nombre de rangées n'est pas le même, il serait idéal de remplir le reste avec n'importe quel type, mais je sais que c'est trop demander. – Tom

Répondre

1

Quelque chose comme cette requête devrait faire:

Select some_value, x, c 
From 
(
    Select 
    some_value, x, 
    Case When x=1 Then @c1 Else @c2 End As c, 
    @c1 := Case When x=1 Then @c1+2 Else @c1 End As c1, 
    @c2 := Case When x=2 Then @c2+2 Else @c2 End As c2 
    From test_data, (Select @c1:=0, @c2:=1) v 
    Order By some_value 
) sub 
Order By c 

Affecte des nombres pairs uniques à x=0 et des nombres impairs à x=1 et utilise ces valeurs comme critères de tri.


Il retourne

some_value x c 
A   1 0 
X   2 1 
B   1 2 
Y   2 3 
C   1 4 
Z   2 5 

pour le test-données suivantes:

Create Table test_data (
    some_value VARCHAR(10), 
    x INT 
); 

Insert Into test_data Values('A', 1); 
Insert Into test_data Values('B', 1); 
Insert Into test_data Values('C', 1); 
Insert Into test_data Values('Z', 2); 
Insert Into test_data Values('Y', 2); 
Insert Into test_data Values('X', 2); 

Dans les valeurs des règles en alternance sont classés par some_value, vous pouvez le modifier dans l'intérieur sélectionnez ou ajoutez vos conditions ici.

S'il y a plus de valeurs d'un certain type (1 ou 2), vous les obtenez après le reste (1 2 1 2 2 2).

+0

@Peter Lang: Inspiré des choses, merci. Va jouer avec ça. – Tom

0

Vous pouvez utiliser la fonction IF dans le cadre de votre instruction SELECT pour modifier les colonnes, mais je ne suis pas sûr que la méthode make soit alternative automatiquement entre deux colonnes. Si vous trouvez cependant bon état cela fonctionnera pour vous

SELECT IF(condition, first_column, second_column) FROM your_table 

first_column et second_column peuvent être de différents types, par exemple:

SELECT IF(id > 10, name, status_id) FROM clients 

fonctionne bien lorsque name est un VARCHAR et status_id est un INT

+0

@RaYell: Merci, presque là, mais pas tout à fait. Ne pas chercher à retourner des colonnes différentes, et il ne traite pas vraiment de l'alternance, qui est l'essentiel de la question. – Tom

Questions connexes