我想按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()