代码之家  ›  专栏  ›  技术社区  ›  Maiasaura

如何为每个组选择固定数量的行?

  •  7
  • Maiasaura  · 技术社区  · 16 年前

    以下是MySQL表中的一些示例数据

    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
    

    如何查询此表,以便随机选择每个距离2行?

    成功的查询将产生

       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 回复  |  直到 13 年前
        1
  •  5
  •   OMG Ponies    13 年前

    用途:

    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
  •  0
  •   OMG Ponies    16 年前

    一种方法是使用联合。像这样:

    (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
    

    我可以想出一种方法,通过使用distinct=/的一个查询来获取每个查询中的一个,但正如我所说,这只会给您带来一个。

        3
  •  0
  •   mdma    16 年前

    我想知道这样行不行?

    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
       )
    

    编辑:不幸的是没有。子查询中不支持限制。

    推荐文章