我在5.5.35和5.6.19上尝试过它。两者都返回不同的结果 我基本上试图找到公司达到某个总点数值的确切日期(在这种情况下为250)
如果我的最终SQL查询没有错误,5.5.35似乎会返回预期的结果。
DROP TABLE IF EXISTS company_sales;
CREATE TABLE `company_sales` (
`id_company_sales` bigint(20) NOT NULL AUTO_INCREMENT,
`company_id` int(11) NOT NULL,
`order_id` int(11) DEFAULT NULL,
`date` date NOT NULL,
`points` decimal(10,2) unsigned NOT NULL,
`cancelled` tinyint(1) DEFAULT '0',
`cnd1` int(11) DEFAULT NULL,
`cnd2` varchar(128) DEFAULT '',
`cnd3` mediumint(8) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_company_sales`),
UNIQUE KEY `cnd1_UNIQUE` (`cnd1`),
KEY `index3` (`company_id`,`date`),
KEY `order_id` (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=56919 DEFAULT CHARSET=latin1;
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (48712,6978,64390,'0000-00-00',76.96,1,NULL,'',0);
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (49093,6978,0,'2014-11-01',256.03,0,NULL,'starting',0);
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (47286,6978,63122,'2014-11-23',84.44,1,NULL,'',0);
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (48956,6978,64811,'2014-11-28',76.96,0,NULL,'',0);
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (48962,6978,64817,'2014-11-28',84.44,0,NULL,'',0);
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (49042,6978,64900,'2014-11-28',57.52,0,NULL,'',0);
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (49048,6978,64905,'2014-11-28',28.76,0,NULL,'',0);
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (49090,6978,64945,'2014-11-28',8.35,0,NULL,'',0);
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (53416,6978,0,'2014-12-01',106.80,0,NULL,'starting',0);
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (53415,6978,69189,'2014-12-09',26.10,0,NULL,'',0);
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (53459,6978,69231,'2014-12-09',16.55,0,NULL,'',0);
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (53959,6978,69701,'2014-12-10',64.15,0,NULL,'',0);
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (57880,4605,73805,'2014-12-18',92.13,0,NULL,'',0);
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (57879,6212,73804,'2014-12-18',21.12,0,NULL,'',0);
INSERT INTO `company_sales` (`id_company_sales`,`company_id`,`order_id`,`date`,`points`,`cancelled`,`cnd1`,`cnd2`,`cnd3`) VALUES (57878,7395,73626,'0000-00-00',39.97,1,NULL,'',0);
SELECT
NULL AS id_company_sales,
NULL AS date,
NULL AS points,
NULL AS total
FROM DUAL WHERE
(@total:=0)
UNION SELECT
id_company_sales,
(date),
points,
@total:=@total + points AS total
FROM
company_sales cs
WHERE
cs.company_id = 6978
AND cs.date >= '2014-11-21'
AND cs.date <= '2014-12-21'
AND cs.cancelled = 0
AND cs.order_id != 0
AND @total < 250
ORDER BY id_company_sales DESC
LIMIT 1;
编辑:我已经提交了关于MySQL的错误报告 http://bugs.mysql.com/bug.php?id=75266
答案 0 :(得分:0)
使用这样的用户定义变量(例如In [11]:
import simplejson as json
In [12]:
data = {('category1', 'category2'): 4}
In [13]:
json.dumps(data)
)有点不确定。如果您在相同的MySQL版本上运行相同的查询,它可能会工作。但是,在MySQL版本更新中,查询优化器可能已在内部更改并执行相同的查询。
MySQL manual还声明:
作为一般规则,除了在SET语句中,你永远不应该 为用户变量赋值并读取其中的值 声明。例如,要增加变量,这没关系:
SET @a = @a + 1;
对于其他语句,例如SELECT,您可能会得到结果 期待,但这不能保证。在以下声明中,您 可能会认为MySQL会首先评估@a然后做一个 第二个任务:
SELECT @ a,@ a:= @ a + 1,...;
但是,涉及用户的表达式的评估顺序 变量未定义。
总结:相同查询的结果可能会也可能不会从MySQL版本更改为MySQL版本。无法保证查询在任何给定的MySQL版本中都能按预期工作。