我在sql查询中得到了一些意想不到的结果。如果我连接的表有记录,那么当我应该得到一个每行都为null的集时,我会得到一个空的结果集,我不知道这是为什么?
当昨天的数据还在表中时,我得到一个 empty result set
. 如果清空表并运行相同的查询,则会得到预期的结果集:
cnt | partner | today
0 | 3000 | NULL
0 | 3001 | NULL
0 | 3002 | NULL
0 | 3003 | NULL
0 | 3004 | NULL
0 | 3005 | NULL
0 | 3006 | NULL
0 | 3007 | NULL
我做错什么了?
CREATE TABLE `partner` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'unik räknare' ,
`url` TEXT NOT NULL COMMENT 'webadress' ,
`imgurl` TEXT NOT NULL COMMENT 'bildurl' ,
`displayname` VARCHAR(256) NOT NULL COMMENT 'firmanamn' ,
`annons` TEXT NULL COMMENT 'annons ord' ,
PRIMARY KEY (`id`)
) ENGINE = MyISAM CHARSET=utf8 COLLATE utf8_swedish_ci AUTO_INCREMENT=3000 COMMENT = 'Tabell innehållande samarbetspartners (saps)';
CREATE TABLE `sap_daily_stats` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'unik räknare' ,
`partner` INT UNSIGNED NOT NULL COMMENT 'partner.id' ,
`servertime` INT UNSIGNED NOT NULL COMMENT 'datum' ,
`browser` VARCHAR(256) NOT NULL COMMENT 'HTTP_USER_AGENT' ,
`remoteaddr` VARCHAR(40) NOT NULL COMMENT 'REMOTE_ADDR' ,
`httpacclang` VARCHAR(72) NULL COMMENT 'HTTP_ACCEPT_LANGUAGE' ,
PRIMARY KEY (`id`)
) ENGINE = MyISAM CHARSET=utf8 COLLATE utf8_swedish_ci AUTO_INCREMENT=10000 COMMENT = 'Tabell innehållande dagens annonsstatistik';
SELECT
COUNT(`q`.`partner`) - (
CASE WHEN DATE_FORMAT(FROM_UNIXTIME(`d`.`servertime`),'%Y-%m-%d') IS NULL THEN 1
ELSE 0
END) AS `cnt`,
`q`.`partner`,
DATE_FORMAT(FROM_UNIXTIME(`d`.`servertime`),'%Y-%m-%d') AS `today`
FROM `sap_quotas` `q`
LEFT JOIN `sap_daily_stats` `d`
ON `q`.`partner` = `d`.`partner`
GROUP BY `q`.`partner`,`today`
HAVING `today` = CURDATE() OR `today` IS NULL
ORDER BY `today` IS NULL DESC,
`cnt` ASC,
`q`.`partner` ASC
不知道是否与版本有关,但这是我当前的设置:
数据库服务器
Server: MySQL (127.0.0.1 via TCP/IP)
Server type: MySQL
Server version: 5.7.21 - MySQL Community Server (GPL)
Protocol version: 10
Server charset: UTF-8 Unicode (utf8)
web服务器
Apache/2.4.33 (Win32) PHP/7.2.4
Database client version: libmysql - mysqlnd 5.0.12-dev - 20150407
PHP extension: mysqliDocumentation curlDocumentation mbstringDocumentation
PHP version: 7.2.4
1条答案
按热度按时间c6ubokkw1#
如果您有昨天的数据(根据op),那么左连接将不会创建
today
列为空。获取null的一种方法是在连接条件(如下所示)中使用filter,而不是在having条件中使用filter。