0

次のようなクエリを実行するときに 1 つの操作を行う方法: types.init と types.end は符号なしの数値であり、この場合B.init=0 and B.end=0

SET @init:=20;
SET @end:=100;

SELECT
  A.`type_id`, B.`type_id`,count(A.id)
FROM
  `types` A ,`types` B 
WHERE
  A.`init` BETWEEN B.`init`- @init
  AND B.`init` +  @init
  AND  A.`end` BETWEEN B.`end`-  @end
  AND B.`end` +  @end

次に、このエラーが発生します。

 #1690 - BIGINT UNSIGNED value is out of range in '(`database`.`B`.`init` - (@init))'
4

1 に答える 1

1

CASTを使用して SIGNED に変換するか、CASEを使用して B.init >= @init かどうかを確認する必要があります。

前者の場合、クエリは次のようになります。

WHERE
  CAST(A.`init` AS SIGNED) BETWEEN CAST(B.`init` AS SIGNED) - @init
  AND CAST(B.`init` AS SIGNED) +  @init
  AND CAST(A.`end` AS SIGNED) BETWEEN CAST(B.`end` AS SIGNED) -  @end
  AND CAST(B.`end` AS SIGNED) +  @end

後者の場合:

WHERE
  A.`init` BETWEEN CASE WHEN B.`init` >= @init THEN B.`init`- @init ELSE 0 END
  AND B.`init` +  @init
  AND  A.`end` BETWEEN CASE WHEN B.`end` >= @end THEN B.`end`-  @end ELSE 0 END
  AND B.`end` +  @end
于 2013-01-24T03:56:21.353 に答える