How do I select a fixed number of rows for each group?

后端 未结 3 1394
[愿得一人]
[愿得一人] 2020-12-31 17:10

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
9         


        
相关标签:
3条回答
  • 2020-12-31 17:48

    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
    
    0 讨论(0)
  • 2020-12-31 17:49

    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.

    0 讨论(0)
  • 2020-12-31 18:12

    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.

    0 讨论(0)
提交回复
热议问题