Php MySQL随机结果按顺序分组按

Php MySQL随机结果按顺序分组按,php,mysql,group-by,Php,Mysql,Group By,如何在group bygroup\u id上获得随机结果 类似的情况如下: 这是我的小提琴: 不知道为什么它总是给我同样的结果 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`

如何在
group by
group\u id上获得随机结果

类似的情况如下:

这是我的小提琴:

不知道为什么它总是给我同样的结果

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()
试一试

不分组

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

试一试

不分组

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


这是因为
groupby
合并具有相同
GROUP\u id
的行,因此您的查询只提供一行作为结果,因此,尽管使用了
ORDER BY RAND()
,结果始终是相同的

如果使用此选项,将得到一个随机结果,但是,在不分组的情况下:

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

这是因为
groupby
合并具有相同
GROUP\u id
的行,因此您的查询只提供一行作为结果,因此,尽管使用了
ORDER BY RAND()
,结果始终是相同的

如果使用此选项,将得到一个随机结果,但是,在不分组的情况下:

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

“订单依据”是关于您获得的所有结果。您正在对所有结果进行分组,因此它只返回第一个数据,因为只有一个组。如果您有多个组,它将返回每个组的第一个数据

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

.

订单依据是您获得的所有结果。您正在对所有结果进行分组,因此它只返回第一个数据,因为只有一个组。如果您有多个组,它将返回每个组的第一个数据

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

.

假设您希望从
type=1下的每个组中获得一条随机记录:

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


假设您希望从
type=1下的每个组中获得一条随机记录:

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


您的查询是针对sql标准的,因为您在select列表中列出了group by子句中未列出的列,也不是聚合函数的主题,例如count()。MySQL在某些sql模式设置下允许此功能

但是,即使启用此功能,MySQL也会:

MySQL扩展了GROUPBY的标准SQL用法,因此select列表可以引用GROUPBY子句中未命名的未聚合列。这意味着前面的查询在MySQL中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要是在GROUP BY中未命名的每个未聚合列中的所有值对于每个组都相同时才有用。服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的此外,添加ORDER by子句不会影响从每个组中选择值。结果集排序发生在选择值之后,排序依据不影响服务器在每个组中选择的值。

因此,使用排序和limit子句来限制输出,而不是使用group by:

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

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

您的查询是针对sql标准的,因为您在select列表中列出了group by子句中未列出的列,也不是聚合函数(如count())的主题。MySQL在某些sql模式设置下允许此功能

但是,即使启用此功能,MySQL也会:

MySQL扩展了GROUPBY的标准SQL用法,因此select列表可以引用GROUPBY子句中未命名的未聚合列。这意味着前面的查询在MySQL中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要是在GROUP BY中未命名的每个未聚合列中的所有值对于每个组都相同时才有用。服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的此外,添加ORDER by子句不会影响从每个组中选择值。结果集排序发生在选择值之后,排序依据不影响服务器在每个组中选择的值。

因此,使用排序和limit子句来限制输出,而不是使用group by:

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

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

您的结果始终为一行。因此,您可以按任何方式进行订购-每次都是第一次这是您的要求:
从每个组中随机获取记录
?您的结果始终只有一行。因此,您可以按任何方式进行订购-每次订购第一个是您的要求:
从每个组中获取随机记录
?此解决方案仍然不符合sql标准,可以在不使用子查询的情况下解决此问题。此解决方案仍然不符合sql标准,并且可以在不使用子查询的情况下解决此问题子查询。您如何建议最好的方法:)?我想根据组id随机获得结果,不受其结果的限制。您如何建议最好的方法:)?我想根据组id随机获得结果,不限制其结果。