非隐式连接,右连接为空时返回

时间:2011-03-08 19:55:44

标签: mysql sql database

我有两张桌子:

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

如果某个联系人在一个群组中,那么一个条目会被cglcontactId放入groupId表。

一切正常。

我想要执行一个查询,从cgaccount = 1获取所有组的所有信息。

作为此查询的一部分,我还想添加一个名为number的额外行,如果该组的cgl表中有条目,则该行具有该数字。

我正在使用

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

只要至少有一个联系人,就完美。 否则该组不会被退回。

我必须对此查询做些什么才能让它返回所有组?

2 个答案:

答案 0 :(得分:1)

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

换句话说,请使用此查询:

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子句。)

答案 1 :(得分:1)

使用LEFT JOIN,并且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