Voici quelques exemples de données dans une table MySQL
a b distance
30 41 250
95 18 250
59 25 500
65 85 500
15 57 750
89 35 750
79 22 1000
98 41 1000
3 Réponses :
Utilisation:
SELECT x.a,
x.b,
x.distance
FROM (SELECT t.a,
t.b,
t.distance
CASE
WHEN @distance != t.distance THEN @rownum := 1
ELSE @rownum := @rownum + 1
END AS rank,
@distance := t.distance
FROM TABLE t
JOIN (SELECT @rownum := 0, @distance := '') r
ORDER BY t.distance --important for resetting the rownum variable) x
WHERE x.rank <= 2
ORDER BY x.distance, x.a
C'est souvent une éducation lisant vos réponses. Comment les lignes sont-elles sélectionnées aléatoires?
@MDMA: Les lignes sont classées de manière aléatoire car elles sont commandées uniquement par la valeur de distance - toute paire de valeur A & B peut être classée comme 1, etc. Le commander par T.Distance code> est juste pour garder Les valeurs de distance regroupées, la déclaration de cas réinitialise correctement la valeur ROWNUM pour démarrer à 1 lorsqu'une nouvelle valeur de distance est rencontrée.
Merci pour la clarification. Cela ne signifie pas que les lignes sélectionnées sont arbitraires plutôt que aléatoires. (C'est-à-dire qu'ils pourraient être les mêmes chaque fois que la requête est courante?)
@MDMA: Commander par la colonne de distance ne garantit que les mêmes valeurs A et B seront toujours renvoyées à la même position. Et être aléatoire ne garantit pas que différentes valeurs seront toujours retournées.
@Omgponies: ne devrait-il pas le @Distance = to.distance code> être un @DISTANCE: = T.DISTANCE code> à la place?
Un moyen serait d'utiliser Union. Comme:
(SELECT a, b, distance FROM table WHERE distance = 250 LIMIT 2 ORDER BY RAND()) UNION (SELECT a, b, distance FROM table WHERE distance = 500 LIMIT 2 ORDER BY RAND()) ... ORDER BY distance
En utilisant Union tout code> serait mieux, voyant qu'il n'y aurait pas de duplicats à être supprimés. En outre, commander par rand () code> ne fonctionne pas bien: Stackoverflow.com/Questtions/1823306/...
Je me demande si cela fonctionnera? EDIT: Malheureusement pas. La limite n'est pas prise en charge dans une sous-requête. P> p>