ORDER BY rand() and group with group_id


ORDER BY rand() and group with group_id

我想按group_id:排序,按随机顺序选择行

id  group_id
1   1
2   1
3   2
4   2
5   3
6   4

我希望它们像下面这样排序,或者随机化,但仍然分组:

id  group_id
5   3
3   2
4   2
1   1
2   1
6   4

下面将对它们进行排序,但我希望排序是随机的。如何做到这一点?

SELECT * FROM table ORDER BY group_id DESC

下面是我为实际应用程序计算的一个示例查询。

SELECT * FROM ( SELECT requests.*, accounts.username, accounts.password
FROM requests LEFT JOIN accounts ON requests.acc_id = accounts.id
WHERE requests.status NOT IN(1) AND accounts.status=1 ORDER BY RAND()
)  AS subquery GROUP BY acc_id 

您可以尝试按随机数排序,其中种子取决于group_id,但使用随机因子。像这样:

SET @seed = 100*RAND();
SELECT * FROM table ORDER BY RAND(group_id*@seed);

您可以使用一个子查询来随机排序所有组ID,并使用用户变量为其分配位置。然后将其与原始表格连接起来,并按位置排序。

SELECT t1.id, t1.group_id
FROM yourTable AS t1
JOIN (SELECT group_id, @position := @position + 1 as position
      FROM (SELECT DISTINCT(group_id) AS group_id
            FROM yourTable
            ORDER BY RAND()) AS x
      CROSS JOIN (SELECT @position := 0) AS var) AS t2
ON t1.group_id = t2.group_id
ORDER BY position, id

演示

我不明白为什么其他答案如此复杂。

如果需要按随机顺序排列行,只需执行ORDER BY RAND()即可。

SELECT t.id
     , t.group_id
  FROM `table` t
 ORDER BY RAND()

请注意,RAND()不是真正的随机,它是一个随机生成器。


我不明白你为什么需要一个内联视图。您可以在没有内联视图的情况下执行GROUP BY操作。给定GROUP BY,就不需要在内联视图中执行不必要的ORDER BY操作。

 SELECT requests.*
      , accounts.username
      , accounts.password
   FROM requests
   LEFT
   JOIN accounts
     ON requests.acc_id = accounts.id
  WHERE requests.status NOT IN(1)
    AND accounts.status=1
  GROUP
     BY acc_id
  ORDER
     BY RAND()