问题
Here is some example data in a mysql table
a b distance
15 44 250
94 31 250
30 41 250
6 1 250
95 18 250
72 84 500
14 23 500
55 24 500
95 8 500
59 25 500
40 73 500
65 85 500
32 50 500
31 39 500
22 25 500
37 11 750
98 39 750
15 57 750
9 22 750
14 44 750
69 22 750
62 50 750
89 35 750
67 65 750
74 37 750
52 36 750
66 53 750
82 74 1000
79 22 1000
98 41 1000
How do I query this table such that I get 2 rows per distance selected at random?
A successful query will produce something like
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
回答1:
Use:
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
回答2:
One way would be to use union. Like so:
(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
I can think of a way of getting one of each with one query using distinct =/, but like I said that would only bring you one.
回答3:
I wonder if this will work?
SELECT
a,b,distance
FROM YourTable t2
WHERE ROW(a,b,distance) IN
(
SELECT a,b,distance FROM YourTable t1
WHERE t1.distance=t2.distance ORDER BY RAND() LIMIT 2
)
EDIT: unfortunately not. LIMIT is not supported in a subquery.
来源:https://stackoverflow.com/questions/2886064/how-do-i-select-a-fixed-number-of-rows-for-each-group