1

基本クエリは意図したとおりに機能しますが、最初の列を合計しようとすると、5 になると想定されますが、4 になるのはなぜですか?

ベースクエリ:

SET @last_task = 0;
SELECT 
  IF(@last_task = RobotShortestPath, 0, 1) AS new_task,
  @last_task := RobotShortestPath
FROM rob_log
ORDER BY rog_log_id;

1   1456
0   1456
0   1456
1   1234
0   1234
1   1456
1   2556
1   1456

合計クエリ

SET @last_task = 0;
SELECT SUM(new_task) AS tasks_performed
FROM (
  SELECT 
    IF(@last_task = RobotShortestPath, 0, 1) AS new_task,
    @last_task := RobotShortestPath
  FROM rob_log
  ORDER BY rog_log_id
) AS tmp

4

テーブル構造

CREATE TABLE rob_log (
  rog_log_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
#  RobotPosX FLOAT NOT NULL,
#  RobotPosY FLOAT NOT NULL,
#  RobotPosDir TINYINT UNSIGNED NOT NULL,
  RobotShortestPath MEDIUMINT UNSIGNED NOT NULL,
  PRIMARY KEY(rog_log_id),
  KEY (rog_log_id, RobotShortestPath)
);

INSERT INTO rob_log(RobotShortestPath) SELECT 1456;
INSERT INTO rob_log(RobotShortestPath) SELECT 1456;
INSERT INTO rob_log(RobotShortestPath) SELECT 1456;
INSERT INTO rob_log(RobotShortestPath) SELECT 1234;
INSERT INTO rob_log(RobotShortestPath) SELECT 1234;
INSERT INTO rob_log(RobotShortestPath) SELECT 1456;
INSERT INTO rob_log(RobotShortestPath) SELECT 2556;
INSERT INTO rob_log(RobotShortestPath) SELECT 1456;

sqlfiddle でテストする: http://sqlfiddle.com/#!2/e80f5/3は、 MySQL でのタイムラインの変更をカウントする ための答えとして、かなり混乱しましたが、かなり 混乱しました

4

2 に答える 2

4

理由は次のとおりです(Twitterで議論されているように):

変数 @last_task は、別のクエリ「バッチ」で定義されました。SQL Fiddle のクエリを個別のバッチに分割し、個別に実行します。これを行うのは、各バッチからの出力を以下の個別の結果セットとして確認できるようにするためです。Fiddle には、2 つの出力セットがあることがわかります: http://sqlfiddle.com/#!2/e80f5/3/0http://sqlfiddle.com/#!2/e80f5/3/1 . これらは、実行中の 2 つのステートメント (set と select) にマップされます。問題は、set ステートメントが最初のバッチにのみ存在する変数を定義していることです。selectステートメントが実行されると、それは別のバッチになり、変数はそのコンテキスト内で定義されません。

この問題を解決するには、別のクエリ ターミネータを定義するだけです。スキーマとクエリ パネルの両方の下にあるドロップダウン ボックス/ボタン ( [ ; ] ) に注意してください。これをクリックすると、セミコロン (デフォルト) 以外のものを選択できます。次に、2 つのステートメントが同じバッチの一部として一緒に含まれ、必要な結果が得られます。例: http://sqlfiddle.com/#!2/e80f5/9

于 2012-07-22T19:00:16.283 に答える
2

おそらく古いバージョンの MySQL のバグです。

MySQL 5.5 で試してみましたが、完全に機能しています。

于 2012-07-20T10:28:40.587 に答える