Mysql 非隐式联接,右联接为空时返回
我有两张桌子: contactGroupsMysql 非隐式联接,右联接为空时返回,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
cg
和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,
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