2011-01-15 4 views
2

Tout d'abord, je ne suis pas familier avec SQL en profondeur, donc cela peut être une question débutant. Je sais comment sélectionner les données classées par Id: SELECT * FROM foo ORDER BY id LIMIT 100 et comment sélectionner un sous-ensemble aléatoire: SELECT * FROM foo ORDER BY RAND() LIMIT 100.Comment interférer plusieurs résultats SELECT?

Je voudrais fusionner ces deux requêtes en 1 de manière zip, en choisissant limit/2 à partir de chacune (c'est-à-dire 50). Par exemple:

0 
85 
1 
35 
2 
38 
3 
19 
4 
... 

Je souhaite éviter les doublons. Le plus simple est probablement d'ajouter un WHERE id > 100/2 à la partie de la requête qui récupère les lignes ordonnées de manière aléatoire.

Informations supplémentaires: Le nombre de lignes existantes est inconnu.

+0

Quelle base de données utilisez-vous? – Oded

+0

Bonne question. Je pense que mysql? – mafu

Répondre

-1
SELECT * FROM foo ORDER BY id LIMIT 50 UNION SELECT * FROM foo ORDER BY RAND() LIMIT 50 

Si je comprends bien vos besoins. UNION supprime les doublons par lui-même

+0

Cela concatène simplement les résultats, n'est-ce pas? Y a-t-il un moyen de les mélanger comme dans l'exemple? – mafu

2

Pour obtenir la fusion "zip-manière", ajoutez un numéro de séquence généré à chaque requête et utilisez une union avec ordre par numéroRown.
Utilisez les nombres pairs pour les nombres un et impairs pour l'autre requête.

Essayez ceci pour MySQL

SELECT 
    @rownum0:[email protected]+2 rn, 
    f.* 
FROM (SELECT * FROM foo ORDER BY id) f, (SELECT @rownum0:=0) r 
UNION 
SELECT @rownum1:[email protected]+2 rn, 
    b.* 
FROM (SELECT * FROM bar ORDER BY RAND()) b, (SELECT @rownum1:=-1) r 
ORDER BY rn 
LIMIT 100 
+0

Juste vérifié, c'est mysql. – mafu

0

Cela devrait être auto-explicative, mais ne marche pas supprimer les doublons:

select @rownum:[email protected]+1 as rownum, 
     (@rownum-1) % 50 as sortc, u.id 
from (
     (select id from player order by id limit 50) 
     union all 
     (select id from player order by rand() limit 50)) u, 
    (select @rownum:=0) r 
order by sortc,rownum; 

Si vous remplacez "union tous" avec "union", vous supprimez les doublons mais obtenez moins de lignes en conséquence.

Cela traitera des doublons, ne limite pas des nombres aléatoires dans les ids> 50, et retour toujours 100 lignes:

SELECT @rownum := @rownum + 1 AS rownum, 
     (@rownum - 1) % 50 AS sortc, 
     u.id 
FROM ((SELECT id 
     FROM foo 
     ORDER BY Rand() 
     LIMIT 50) 
     UNION 
     (SELECT id 
     FROM foo 
     WHERE id <= 100 
     ORDER BY id)) u, 
     (SELECT @rownum := 0) r 
WHERE @rownum < 100 
ORDER BY sortc, 
      rownum DESC 
LIMIT 100; 
+1

Ceci traitera des doublons, ne restreindra pas les nombres aléatoires dans les identifiants> 50, et retournera toujours 100 rangées: sélectionnez @rownum: = @ rownum + 1 comme rownum, (@ rownum-1)% 50 comme sortc, u.id de ((select id de foo order par rand() limite 50) union (select id de foo où id <= 100 order par id)) u, (select @rownum: = 0) r où @rownum <100 ordre par sortc , rownum desc limite 100; –

Questions connexes