2016-11-18 76 views
1

我試圖計算具有值的連續行數。舉一個簡單的例子,考慮拋出2個骰子,其值爲1-12。我想要得到具有相同總數的連續行的最高序列值的表格。這裏有一個表定義,存儲過程來填充表,並執行存儲過程的命令:特定值的序列MySql表

CREATE TABLE `Dice_throws` (
    `idx` int(11) NOT NULL AUTO_INCREMENT, 
    `Dice1` tinyint(1) DEFAULT NULL, 
    `Dice2` tinyint(1) DEFAULT NULL, 
    PRIMARY KEY (`idx`) 
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 
--------------------------------- 
DELIMITER $$ 
CREATE PROCEDURE InsertDiceThrows(IN NumRows INT) 
    BEGIN 
     DECLARE i INT; 
     SET i = RAND(12345); /* use the same seed */ 
     SET i = 1; 
     START TRANSACTION; 
     WHILE i <= NumRows DO 
      INSERT INTO Dice_throws(Dice1, Dice2) VALUES (CEIL(RAND() * 6), CEIL(RAND() * 6)); 
      SET i = i + 1; 
     END WHILE; 
     COMMIT; 
    END$$ 
DELIMITER ; 
----------------------------- 
call InsertDiceThrows(2000); 

如果選擇合計(SELECT Dice1, Dice2, Dice1+Dice2 FROM Dice_throws order by idx;)的名單,然後我會得到2000行,這可爲實例2,5,12,6,7,4,8,8,8,5,11,6,6, ..等等。 在它的端我想要的表是這樣的:

Tot Seq 
1 2 
2 2 
3 4 
4 3 
5 7 
6 8 
7 9 
8 4 
9 2 
10 1 
11 2 
12 1 

因此,這表明,在連續的行,其中合計爲4是3,並且連續8行,其中總是最大序列6等所以我想爲每個可能的結果找到總數相同的最高滾動順序。 我明顯可以在PHP中做到這一點(我已經使它與PHP的工作),只需選擇合計,然後循環結果集,但我想知道是否有一些完全在SQL中完成它的好方法。 感謝您提供任何提示或解決方案。

+0

如果我們隨機填充一個表,我們會用不同的數據從您設置爲結束。因此,請提供適當的INSERT語句和相應的期望結果。我相信我們不需要看到2000行。假裝它是一個單面,六面骰子,我敢肯定,幾十行就足夠了。此外,如果您專業地賭博,您可能想要鎖定以下重要事實:用兩個骰子可實現的最低分數是...... 2! – Strawberry

+0

感謝您的提示。我對任何一組的實際結果都不感興趣,我有興趣瞭解如何實現它。 –

回答

0

嘗試以下操作:

CREATE TABLE test (rid int auto_increment PRIMARY KEY, v int not null); 
INSERT test (v) VALUES (2),(2),(3),(3),(3),(2),(4),(4),(4),(4),(4),(4),(2),(2),(2),(2),(1); 

SELECT * FROM test; 

CREATE TABLE chunks (cid int auto_increment PRIMARY KEY, v int not null, c int not null, s int not null); 
INSERT chunks(cid,v,c,s) 
SELECT null,t1.v,t1.rid AS c, 0 
FROM test t1 
LEFT JOIN test t2 ON t1.rid=t2.rid-1 AND t1.v=t2.v 
WHERE t2.rid IS NULL; 

UPDATE chunks c1 LEFT JOIN chunks c2 ON c1.cid=c2.cid+1 
SET c1.s=CASE WHEN c2.c IS NULL THEN 1 ELSE c2.c+1 END; 
SELECT * FROM chunks; 

SELECT v.v,MAX(v.cnt) AS max_cnt 
FROM (
    SELECT c.c, MIN(t1.v) AS v, COUNT(*) AS cnt 
    FROM test t1 
    INNER JOIN chunks c 
    ON t1.rid between c.s and c.c 
    GROUP BY c.c) v 
GROUP BY v.v; 
+0

嗨。感謝回覆,我可以看到它在做什麼。 當我嘗試運行它時,出現以下錯誤: '錯誤代碼:1137. UPDATE行中無法重新打開表:'c1'' 。我會搗鼓,看看我是否做錯了什麼。 –

+0

您使用的是哪個版本的mysql?我在沒有任何問題的情況下在MySQL 5.5中運行它。 – PeterHe