2010-06-07 4 views
1

Я получил эту таблицуMySQL: SUM в ИНЕКЕ

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 

Каждая строка может иметь другое значение в поле «класса».

Я хотел бы, чтобы выбрать любое количество строк, упорядочены случайным образом, до тех пор, как сумма значений в поле «класса» равен 100.

Как я мог выполнить его непосредственно в MySQL запрос, не делая этого позже в PHP?

Спасибо всем!

+0

Я не думаю, что SQL предназначен для этих запросов ... – kennytm

+4

Звучит как вариация проблемы с подмножеством, которая является NP полной: http://en.wikipedia.org/wiki/Subset_sum_problem –

+1

для использования совокупных функций HAVING вместо WHERE –

ответ

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() когда-либо вернется.

0

Я не думаю, что это возможно только с SQL ... единственное, что приходит на ум, чтобы переделать SQL-запрос, пока сумма не 100

Но я понятия не имею, как выбрать случайное число строк одновременно.