我们希望将查询行作为组返回,并按排序顺序显示该组的所有条目。随机地基于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 |
+---------+--------+-------+----------+
答案 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 |
答案 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
不会对结果进行排序,则会合并这些组成员。