【发布时间】:2014-08-14 14:47:48
【问题描述】:
在 phpMyAdmin 中偶然发现了一个潜在的错误(?),虽然这更有可能是我对 MySQL 的误解,所以希望有人能对这种行为有所了解。
使用以下架构
CREATE TABLE IF NOT EXISTS `mlfsql_test` (
`id` int(11) NOT NULL,
`frequency_length` smallint(3) DEFAULT NULL,
`frequency_units` varchar(10) DEFAULT NULL,
`next_delivery_date` date DEFAULT NULL,
`last_created_delivery_date` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
INSERT INTO `mlfsql_test`
(`id`, `frequency_length`, `frequency_units`, `next_delivery_date`, `last_created_delivery_date`) VALUES
(1, 2, 'week', '2014-06-25', NULL),
(2, 3, 'day', '2014-06-27', NULL),
(3, 1, 'week', '2014-08-08', NULL),
(4, 2, 'day', NULL, '2014-06-26');
我想根据当前设置的交货日期或考虑频率的最后交货日期来确定即将交货的行。
想出了以下可以正常工作的查询:
SELECT *, IF (next_delivery_date IS NOT NULL, next_delivery_date,
CASE frequency_units
WHEN 'day' THEN DATE_ADD(last_created_delivery_date, INTERVAL frequency_length DAY)
WHEN 'week' THEN DATE_ADD(last_created_delivery_date, INTERVAL frequency_length WEEK)
WHEN 'month' THEN DATE_ADD(last_created_delivery_date, INTERVAL frequency_length MONTH)
END)
AS next_order_due_date
FROM mlfsql_test
HAVING next_order_due_date IS NULL OR (next_order_due_date BETWEEN CURDATE() AND CURDATE() + INTERVAL 10 DAY)
根据表中当前的数据,我希望它返回 3 行,但 phpMyAdmin 指出总共有 4 行结果,虽然它只显示 3...
我发现,如果我在查询中添加 WHERE 子句,例如 WHERE 1,它将返回 3 行,并声明总共有 3 行。
为什么在没有WHERE 子句的情况下返回的行数不正确?我假设没有一个 phpMyAdmin 假设所有行都会匹配,但是只返回那些实际匹配的行,所以计数是错误的?任何帮助将不胜感激。
编辑: phpMyAdmin 版本 4.2.0
【问题讨论】:
-
你的意思是对于相同的查询,它将显示不同的行。我说的对吗?
-
第一个查询将返回总共 4 行,虽然它只显示 3。添加
WHERE将返回总共 3 行,并显示 3。感兴趣的是为什么它会做一个区别,为什么第一行总行错了,或者是我出了什么问题。 -
我测试了您给定的查询,它将始终返回 3 条记录并显示 3 行您的问题?
-
@ChirayuChiripal 抱歉,
Version 4.2.0
标签: mysql phpmyadmin