MYSQL显示在一列上随机排序的所有条目

时间:2018-03-21 14:51:05

标签: mysql sorting group-by sql-order-by

我们希望将查询行作为组返回,并按排序顺序显示该组的所有条目。随机地基于set_id ...然后按sort_id按顺序排列。

所以,随机它会显示:

  

卡尔   菲尔,   温迪,   蒂娜,   里克,   乔

  

蒂娜,   里克,   乔,   卡尔   菲尔,   温迪

此查询始终首先显示Tina / Rick / Joe

SELECT * FROM products ORDER BY set_id, rand()

任何帮助将不胜感激

+---------+--------+-------+----------+

| id      | set_id | name  | sort_id  |

+---------+--------+-------+----------+

|       1 | AA     |Rick   |      2   |

|       2 | BB     |Carl   |      1   |

|       3 | AA     |Joe    |      3   |

|       4 | AA     |Tina   |      1   |

|       5 | BB     |Phil   |      2   |

|       6 | BB     |Wendy  |      3   |

+---------+--------+-------+----------+

2 个答案:

答案 0 :(得分:1)

如果您需要一个随机的逗号分隔名称列表,这将起到作用。
这将保持组内的正确排序。

<强>查询

SELECT 
 GROUP_CONCAT(Table_names_rand.names) as names
FROM (

  SELECT
   *
  FROM ( 

    SELECT 
     GROUP_CONCAT(name ORDER BY sort_id) as names
    FROM 
     Table1
    GROUP BY
     set_id
 )
   AS Table1_names
  ORDER BY 
   RAND()
)
 AS Table_names_rand

<强>结果

|                         names |
|-------------------------------|
| Carl,Phil,Wendy,Tina,Rick,Joe |

|                         names |
|-------------------------------|
| Tina,Rick,Joe,Carl,Phil,Wendy |

demo http://www.sqlfiddle.com/#!9/487ac9/9

如果您需要随机名称作为记录输出。

<强>查询

SELECT 
 Table1.name
FROM
 Table1
CROSS JOIN (
  SELECT 
   GROUP_CONCAT(Table_names_rand.names) as names
  FROM (

    SELECT
     *
    FROM ( 

      SELECT 
       GROUP_CONCAT(name ORDER BY sort_id) as names
      FROM 
       Table1
      GROUP BY
       set_id
   )
     AS Table1_names
   ORDER BY 
     RAND()
 )
   AS Table_names_rand
) 
  AS Table_names_rand
ORDER BY
 FIND_IN_SET(name, Table_names_rand.names)

结果

|  name |
|-------|
|  Carl |
|  Phil |
| Wendy |
|  Tina |
|  Rick |
|   Joe |

|  name |
|-------|
|  Tina |
|  Rick |
|   Joe |
|  Carl |
|  Phil |
| Wendy |

demo http://www.sqlfiddle.com/#!9/487ac9/28

答案 1 :(得分:0)

如果我们去掉gorup排序的随机性,你的查询将如下所示:

SELECT 
    * 
FROM 
    products 
ORDER BY 
    set_id, 
    sort_id;

set_id的排序是“分组”结果所必需的,而不是真正对它们进行分组。您不希望对它们进行分组,因为那时将聚合具有相同组的行,这意味着每个组只会输出一行。

由于您只想随机化组,您需要编写另一个查询,为每个组分配一个随机数,如下所示:

SELECT
    set_id,
    RAND() as 'rnd'
FROM
    products
GROUP BY
    set_id

GROUP BY子句确保每个组只选择一次。结果集如下所示:

| set_id |优先|

+ -------- + --------- +

| AA | 0.21 |

| BB | 0.1 |

通过该结果,我们可以将两个查询与JOIN字段上的set_id相结合,从而随机化输出。这会将第二个查询中随机生成的数字添加到第一个查询的结果集中,因此将随机化的静态set_id扩展为rnd

SELECT
    products.*
FROM
    products
    JOIN (
        SELECT
            set_id,
            RAND() as 'rnd'
        FROM
            products
        GROUP BY
            set_id
    ) as rnd ON rnd.set_id = products.set_id
ORDER BY
    rnd.rnd,
    products.set_id,
    products.sort_id;

请注意,仍然要对products.set_id进行分组很重要,因为两个组可能会分配相同的随机数。如果products.set_id不会对结果进行排序,则会合并这些组成员。