2016-11-18 5 views
1

値を持つ連続する行の数を数えようとしています。簡単な例を与えるために、1から12の値を与える2つのダイスがスローされると考えます。私は同じ合計を持つ連続した行の最高のシーケンスの値のテーブルを取得したい。ここでは、テーブル定義、テーブルやストアドプロシージャを実行するコマンドを移入するストアドプロシージャです:特定の値のシーケンス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で、かつ合計が6などだった8つの連続行することを示していますだから私は可能な結果ごとに同じ合計で最高のロール順番を見つけたいと思っています。 私は明らかに結果セットをループして総計を選択するだけで、PHPでこれを行うことができますが、SQLで完全にそれを行う良い方法があるのだろうかと思いました。 ヒントや解決策をありがとう。

+0

我々は、ランダムにテーブルを移入した場合、私たちはあなたから異なるデータセットで終わるつもりです。したがって、適切なINSERT文とそれに対応する望ましい結果を提供してください。私たちは2000行を見る必要はないと確信しています。それが単一の6面のダイであるとふりをして、私は確かに数十列で充分だろう。あなたが専門的に賭けるならば、次の重要な事実を取り除きたいかもしれません:2つのダイスで達成できる最低得点は... 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.テーブルを開くことができません: 'c1'' のUPDATE行。私は何かを間違ってやったかどうかについて調べる。 –

+0

どのバージョンのmysqlを使用しますか?私はmysql 5.5で問題なく実行しました。 – PeterHe

関連する問題