我有这张桌子
CREATE TABLE `subevents` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(150) DEFAULT NULL,
`content` text,
`class` tinyint(4) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=MyISAM
每一行在“class”字段中可以有不同的值。
我想选择任意数量的行,只要“class”字段中的值总和等于100,就可以随机排序。
如何直接在MySQL查询中完成它而不用稍后在PHP中执行它?
谢谢大家!
答案 0 :(得分:2)
通过“随机排序”我假设您的意思是行的顺序无关紧要,但不能多次使用行。因此,您正在寻找class
之和等于100的行组合。使用强力方法。随机生成可能的解决方案,直到找到有效的解决方案。
delimiter //
CREATE PROCEDURE subsetsum(total)
BEGIN
DECLARE sum INTEGER;
REPEAT
CREATE OR REPLACE VIEW `solution`
AS SELECT * FROM `subevents`
WHERE 0.5 <= RAND();
SELECT SUM(`class`) INTO sum FROM `solution`;
UNTIL sum = total END REPEAT;
END
//
delimiter ;
CALL subsetsum(100); /* For example */
SELECT * FROM `solution`;
我已经使用具有随机值的TINYINT列的表进行了测试,实际上速度相当快。唯一的问题是无法保证subsetsum()将永远返回。
答案 1 :(得分:0)
我认为只有SQL才有可能......我想到的唯一一件事就是重做sql查询,只要总和不是100
但我不知道如何一次选择随机行数。