MySQL count, left join, group by 返回零行

标签 mysql sql count group-by

在下面的sql语句中:

 SELECT `keywords`.keyID, count(`keywords-occurencies`.keyID) as countOccurencies 
                    FROM `keywords-occurencies`  
                    LEFT JOIN `keywords` 
                    ON `keywords-occurencies`.keyID = `keywords`.keyID 
                    WHERE `keywords-occurencies`.`keyID` IN (1,2,3) AND date BETWEEN '2013/01/25' AND '2013/01/27'
                    GROUP BY `keywords`.`keyID`

如果 keyID 3 没有返回值则不计为 0 不包含在结果集中,会显示这样的结果

keyID countOccurencies
1       3
3       5

我想像这样显示零结果

keyID countOccurencies
1       3
2       0
3       5

用于测试的示例数据:

--
-- Table structure for table `keywords`
--

CREATE TABLE IF NOT EXISTS `keywords` (
  `keyID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `keyName` varchar(40) NOT NULL,
  PRIMARY KEY (`keyID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `keywords`
--

INSERT INTO `keywords` (`keyID`, `keyName`) VALUES
(1, 'testKey1'),
(2, 'testKey2');

-- --------------------------------------------------------

--
-- Table structure for table `keywords-occurencies`
--

CREATE TABLE IF NOT EXISTS `keywords-occurencies` (
  `occurencyID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `keyID` int(10) unsigned NOT NULL,
  `date` date NOT NULL,
  PRIMARY KEY (`occurencyID`),
  KEY `keyID` (`keyID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `keywords-occurencies`
--

INSERT INTO `keywords-occurencies` (`occurencyID`, `keyID`, `date`) VALUES
(1, 1, '2013-01-27'),
(2, 1, '2013-01-26');

--
-- Constraints for table `keywords-occurencies`
--
ALTER TABLE `keywords-occurencies`
  ADD CONSTRAINT `keywords@002doccurencies_ibfk_1` FOREIGN KEY (`keyID`) REFERENCES `keywords` (`keyID`) ON DELETE CASCADE ON UPDATE CASCADE;

最佳答案

<罢工>

<罢工>

要做的事

  • 您应该使用 GROUP BY keywords-occurencies.keyID 对其进行分组
  • 并且您必须显示 keywords-occurencies.keyID 而不是 keywords.keyID
  • COUNT keywords.keyID
  • (可选)使用ALIAS 这样你就可以去掉除 tableNames 之外的反引号

查询,

SELECT  a.keyID,
        count(b.keyID) AS countOccurencies
FROM    `keywords - occurencies` a
        LEFT JOIN `keywords` b
            ON a.keyID = b.keyID
WHERE   a.keyID IN ( 1, 2, 3 ) AND 
        DATE BETWEEN '2013/01/25' AND '2013/01/27'
GROUP   BY a.keyID

<罢工>

更新 1

根据示例记录,您需要执行以下操作,

  • 交换表名
  • 将此条件 DATE BETWEEN '2013-01-25' AND '2013-01-27' 放在连接的 ON 子句上。
  • (可选)使用ALIAS 这样你就可以去掉除 tableNames 之外的反引号

查询,

SELECT  a.keyID,
        count(b.keyID) AS countOccurencies
FROM    `keywords` a
        LEFT JOIN `keywords-occurencies` b
            ON a.keyID = b.keyID AND
               b.DATE BETWEEN '2013-01-25' AND '2013-01-27'
WHERE   a.keyID IN ( 1, 2, 3 ) 
GROUP   BY a.keyID

关于MySQL count, left join, group by 返回零行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14549120/

相关文章:

spring - Spring Batch-计算已处理的行

MySQL选择特定数量并计算所有可能

mysql - Union在mysql中与group by一起使用时不起作用?怎么了?

c# - 如何在 Entity Framework Core 中执行 SQL 查询而不修改上下文类

php - mysql 因某些字符而阻塞,而 mssql 不会

php - 使用 ORM 进行查询并在内部一起使用 (AND) 和 (OR)

mysql - 如何加入3个表,主题,评论和用户

python - 识别并计算用户定义段内的点

mysql - 数据库设计 - 一个表或多个表/连接

消息系统的Mysql查询。一个我想不通的小错误