我的桌子结构是......有一个柜台里面有很多Box。 Box有一个BoxType。和收集商店Box日期收入和数据。我需要特别是1 COUNTER的数据(所有盒子的数据都属于它。)。
计数器表
框表
box_type表
收集表
查询返回某些数据的数据。
查询不处理新插入的数据。 它的消息:#2014 - 命令不同步;您现在无法运行此命令,并且'bt
。end_val
- bt
。start_val
}' <1690 BIGINT UNSIGNED值超出范围/ p>
以下是我的查询... 之前正在使用新数据存在问题
SELECT `b`.`box_id`,
`bt`.`box_type_id`,
`bt`.`price`,
`bt`.`start_val`,
`bt`.`end_val`,
((`bt`.`end_val` - `bt`.`start_val`) + 1) AS totalTickets,
(CASE
WHEN (SELECT SUM(`co1`.`sold_tickets`)
FROM `collections` `co1`
INNER JOIN `boxes` `b1`
ON `b1`.`box_id` = `co1`.`box_id`
AND `b1`.`status` = "1"
INNER JOIN `counters` `c1`
ON `c1`.`counter_id` = `b1`.`counter_id`
AND `c1`.`status` = "1"
INNER JOIN `box_types` `bt1`
ON `bt1`.`box_type_id` = `b1`.`box_type_id`
AND `bt1`.`status` = "1"
WHERE `co1`.`status` = "1" AND `b1`.`box_id` = `b`.`box_id`)
IS NULL
THEN
0
ELSE
(SELECT SUM(`co1`.`sold_tickets`)
FROM `collections` `co1`
INNER JOIN `boxes` `b1`
ON `b1`.`box_id` = `co1`.`box_id`
AND `b1`.`status` = "1"
INNER JOIN `counters` `c1`
ON `c1`.`counter_id` = `b1`.`counter_id`
AND `c1`.`status` = "1"
INNER JOIN `box_types` `bt1`
ON `bt1`.`box_type_id` = `b1`.`box_type_id`
AND `bt1`.`status` = "1"
WHERE `co1`.`status` = "1" AND `b1`.`box_id` = `b`.`box_id`)
END)
AS soldTickets,
( ((`bt`.`end_val` - `bt`.`start_val`) + 1)
- (CASE
WHEN (SELECT SUM(`co1`.`sold_tickets`)
FROM `collections` `co1`
INNER JOIN `boxes` `b1`
ON `b1`.`box_id` = `co1`.`box_id`
AND `b1`.`status` = "1"
INNER JOIN `counters` `c1`
ON `c1`.`counter_id` = `b1`.`counter_id`
AND `c1`.`status` = "1"
INNER JOIN `box_types` `bt1`
ON `bt1`.`box_type_id` = `b1`.`box_type_id`
AND `bt1`.`status` = "1"
WHERE `co1`.`status` = "1"
AND `b1`.`box_id` = `b`.`box_id`)
IS NULL
THEN
0
ELSE
(SELECT SUM(`co1`.`sold_tickets`)
FROM `collections` `co1`
INNER JOIN `boxes` `b1`
ON `b1`.`box_id` = `co1`.`box_id`
AND `b1`.`status` = "1"
INNER JOIN `counters` `c1`
ON `c1`.`counter_id` = `b1`.`counter_id`
AND `c1`.`status` = "1"
INNER JOIN `box_types` `bt1`
ON `bt1`.`box_type_id` = `b1`.`box_type_id`
AND `bt1`.`status` = "1"
WHERE `co1`.`status` = "1"
AND `b1`.`box_id` = `b`.`box_id`)
END))
AS remainingTickets
FROM `collections` `co`
INNER JOIN `boxes` `b`
ON `b`.`box_id` = `co`.`box_id` AND `b`.`status` = "1"
INNER JOIN `counters` `c`
ON `c`.`counter_id` = `b`.`counter_id` AND `c`.`status` = "1"
INNER JOIN `box_types` `bt`
ON `bt`.`box_type_id` = `b`.`box_type_id` AND `bt`.`status` = "1"
WHERE `co`.`status` = "1" AND `b`.`counter_id` = "1"
GROUP BY `b`.`box_id`
ORDER BY `b`.`box_id` ASC
如何改进此查询以获得一致的效果,并且有更好的方法来做这件事。
答案 0 :(得分:0)
由于@barace在dba论坛上,FInnaly解决了这个问题。
我认为问题不在于您的查询,而在于您的数据。看看错误信息
它的观点是:#2014 - 命令不同步;你不能运行这个命令 现在和1690 BIGINT UNSIGNED值超出范围 &#39;(bt.end_val-bt.start_val)&#39;
我认为由于某种原因,现在(数据输入错误?),您的查询试图将负值插入到不允许的UNSIGNED INT中。
[编辑]
我觉得很奇怪,你不能从另一个整数中减去一个整数,所以我测试了一个样本数据集。
mysql> CREATE TABLE `test1` (
-> `start_val` int(10) unsigned NOT NULL,
-> `end_val` int(10) unsigned NOT NULL
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.50 sec)
mysql> insert into test1 values(3, 4);
Query OK, 1 row affected (0.05 sec)
mysql> insert into test1 values(4, 3);
Query OK, 1 row affected (0.05 sec)
所以,简单表中的两个简单记录。
然后我运行了这个非常简单的查询:
mysql> select end_val - start_val from test1;
和不可思议我得到了结果:
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(`test`.`test1`.`end_val` - `test`.`test1`.`start_val`)
我调查并发现有一个设置
默认情况下,整数操作数之间的减法会产生UNSIGNED 结果,如果任何操作数是UNSIGNED。
如果要减去UNSIGNED INT值,必须将其关闭。我认为这是MySQL中的一个错误 - 因为MySQL中没有CHECK约束,所以更加令人震惊 - 但是有一个原因可能有很多理由希望减去两个正整数并获得否定结果(债务,诸如此类),但是你在MySQL中无法做到这一点。绝对不可思议!除了PRIMARY KEY之外,不应该使用无符号INT。
这是因为在我的数据结构中... start_val和end_val是UNSIGNED属性..所以他们和父母(&#39;(bt.end_val-bt.start_val)&#39;)制作出来了他们应该是一个UNSIGNED ...但由于错误的数据插入它是在负。导致问题的原因。