php MySQL随机结果分组排序依据

oalqel3c  于 2023-01-08  发布在  PHP
关注(0)|答案(6)|浏览(141)

如何获得group by group_id的随机结果?
它类似于这样:Random order for group of rows in mysql
这是我小提琴:http://sqlfiddle.com/#!9/1c73d/3
不知道为什么它总是给我同样的结果。

CREATE TABLE job
    (`job_id` int, `group_id` int, `user_id` int, `title` varchar(50), `description` varchar(55), `type` tinyint)
;

INSERT INTO job
    (`job_id`, `group_id`, `user_id`, `title`, `description`,`type`)
VALUES
    (1, 1, 100, 'Title 1', 'Text 1', 1),
    (2, 1, 100, 'Title 2', 'Text 2', 1),
    (3, 1, 200, 'Title 3', 'Text 3', 1),
    (4, 1, 200, 'Title 4', 'Text 4', 1),
    (5, 1, 300, 'Title 5', 'Text 5', 2),
    (6, 1, 400, 'Title 6', 'Text 6', 1),
    (7, 1, 200, 'Title 7', 'Text 7', 1);

质询:

select * from job
    where type = 1
    group by group_id
    order by rand()
qjp7pelc

qjp7pelc1#

您的查询违反了sql标准,因为您在选择列表中列出了未在group by子句中列出的列,这些列也不是聚合函数(如count())的主题。MySQL在某些sql模式设置下允许此功能。
但是,即使启用了此功能,MySQL仍具有restrictions on the data chosen from the non-aggregated fields
MySQL扩展了GROUP BY的标准SQL用法,以便选择列表可以引用GROUP BY子句中未命名的非聚集列。这意味着前面的查询在MySQL中是法律的的。您可以使用此功能来避免不必要的列排序和分组,从而获得更好的性能。但是,这主要是在每个组中每个未在GROUP BY中命名的非聚集列中的所有值都相同时有用。2服务器可以自由地从每个组中选择任何值,因此,除非它们相同,否则所选的值是不确定的。此外,添加ORDER BY子句不会影响从每个组中选择值。选择值后将进行结果集排序,ORDER BY不会影响服务器在每个组中选择哪些值。
因此,不要使用group by,而是使用sorting和limit子句来限制输出:

select * from job
    where type = 1
    order by rand()
    limit 1

另外请注意这种随机选择的方法是非常耗费资源的,因为MySQL必须先对整个结果集排序,而不使用任何索引。还有其他方法可以不使用order by rand()从表中随机选择数据。

aiazj4mn

aiazj4mn2#

假设您需要type = 1下每个组中的一个随机记录:

SELECT 
*
FROM 
(
    SELECT
        *
    FROM job
    WHERE type = 1
    ORDER BY RAND()
) AS t
GROUP BY t.group_id;

SQL小提琴演示

kdfy810k

kdfy810k3#

试试看

SELECT *,COUNT(*) totalCount
FROM (SELECT * FROM job WHERE type = 1 ORDER BY RAND()) as temp
GROUP BY group_id

未分组

SELECT * FROM job
WHERE type = 1
ORDER BY rand()
LIMIT 1

SELECT * FROM job
WHERE type = 1
ORDER BY rand()
vof42yt1

vof42yt14#

这是因为GROUP BY合并了具有相同group_id的行,所以您的查询只给您一行作为结果,所以,尽管有ORDER BY RAND(),结果总是相同的。
如果使用此函数,将得到一个随机结果,但不进行分组:

SELECT * 
FROM job
WHERE type = 1
ORDER BY RAND()
LIMIT 1
jjjwad0x

jjjwad0x5#

“排序依据”是关于您获得的所有结果。您将所有结果分组,因此它只返回第一个数据,因为只有一个组。如果您有多个组,它将返回每个组的第一个数据。

select * from (
SELECT * from job order by rand() ) tbl
 group by group_id ;

pes8fvy9

pes8fvy96#

兰德+行编号

select t.*
, @rownum := @rownum+1 AS rowNum
from(
  select * 
  from job
  where type = 1
  order by rand()
) as t, (SELECT @rownum :=0) AS R
group by group_id
order by rowNum

相关问题