如果左联接表不为空,则结果集为空,否则为空

hzbexzde  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(445)

我在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
c6ubokkw

c6ubokkw1#

如果您有昨天的数据(根据op),那么左连接将不会创建 today 列为空。
获取null的一种方法是在连接条件(如下所示)中使用filter,而不是在having条件中使用filter。

LEFT JOIN `sap_daily_stats` `d`
       ON `q`.`partner` = `d`.`partner` 
          and DATE_FORMAT(FROM_UNIXTIME(`d`.`servertime`),'%Y-%m-%d') = CURDATE()

相关问题