2010-06-07 95 views
1

我有了這個表MySQL的:SUM WHERE子句中

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 2010-06-07 11:19:54

+4

聽起來像子集和問題的一個變種,它是NP完整的:http://en.wikipedia.org/wiki/Subset_sum_problem – 2010-06-07 11:21:47

+1

用於聚合函數的使用HAVING而不是WHERE – 2010-06-07 11:26:15

回答

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

但我不知道如何一次選擇隨機數的行。