Mysql 非隐式联接,右联接为空时返回

Mysql 非隐式联接,右联接为空时返回,mysql,sql,database,Mysql,Sql,Database,我有两张桌子: contactGroupscg和contactGroupLinkcgl CREATE TABLE `contactgroups` ( `id` int(11) NOT NULL AUTO_INCREMENT, `account` int(11) DEFAULT NULL, `name` varchar(50) DEFAULT NULL, `description` text, `dateCreated` datetime DEFAULT NULL, PRI

我有两张桌子:

contactGroups
cg
和contactGroupLink
cgl

CREATE TABLE `contactgroups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `account` int(11) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `description` text,
  `dateCreated` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

CREATE TABLE `contactgrouplink` (
  `groupId` int(11) NOT NULL,
  `ContactId` int(11) NOT NULL,
  PRIMARY KEY (`groupId`,`ContactId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
如果某个联系人在一个组中,则会将一个条目放入带有
contactId
groupId
cgl
表中

这一切都很好

我想做一个查询,从
cg
表中获取所有组的所有信息,其中
account=1

作为该查询的一部分,我还想添加一个名为number的额外行,该行包含该组
cgl
表中的number if条目

我正在使用

SELECT
  cg.id AS id,
  NAME,
  description,
  dateCreated,
  COUNT(*) AS number
FROM 
  contactgroups cg,
  contactgrouplink cgl
WHERE 
  cg.account = 1
AND 
  cg.id = cgl.groupId
GROUP BY
  cg.id
只要一个小组至少有一个联系人,它就可以正常工作。 否则将不返回该组


我必须对此查询执行什么操作才能使其返回所有组?

使用左联接为左表的每个成员返回一行,即使右表中没有相应的行

换句话说,使用此查询:

SELECT
  cg.id AS id,
  NAME,
  description,
  dateCreated,
  COUNT(cgl.groupId) AS number
FROM contactgroups AS cg
LEFT JOIN contactgrouplink AS cgl
ON cg.id = cgl.groupId
WHERE cg.account = 1

当然,这将只返回
cg.account=1
的所有组,但我假设这就是您所说的“所有组”。(如果确实需要所有组,则省略WHERE子句)。

使用左连接,并且IFNULL()将在cgl别名表中没有此类匹配记录的情况下防止空值

SELECT   
      cg.id AS id,   
      NAME,   
      description,   
      dateCreated,   
      IFNULL( COUNT(*), 0 ) AS number 
   FROM    
      contactgroups cg
         LEFT JOIN contactgrouplink cgl 
            ON cg.id = cgl.groupID
   WHERE    
      cg.account = 1

@海尔伍德:如果你想要0而不是1,你需要
COUNT(cgl.groupId)
而不是
COUNT(*)
。原因是
COUNT(*)
统计结果集中的行数<代码>计数(x)仅对x不为空的行进行计数。当我将IFNULL行修改为
IFNULL(COUNT(cgl.groupId),0)作为数字时,请参见update for full query.perfict